AccountManager,/home/ubuntu/2025-08-gte-perps/contracts/account-manager/AccountManager.sol#34:1

state_vars_html

(storage) OperatorPanel._getOperatorStorage().self |
(storage) OperatorPanel.approveOperator(address,address,uint256).self | _getOperatorStorage()
(w) 🔗 OperatorPanel.approveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L92 | self.operatorRoleApprovals[account][operator] = approvedRoles | roles
(r) 🔗 OperatorPanel.approveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L91 | approvedRoles = self.operatorRoleApprovals[account][operator]

(storage) OperatorPanel.disapproveOperator(address,address,uint256).self | _getOperatorStorage()
(w) 🔗 OperatorPanel.disapproveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L104 | self.operatorRoleApprovals[account][operator] = approvedRoles & (~ roles)
(r) 🔗 OperatorPanel.disapproveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L103 | approvedRoles = self.operatorRoleApprovals[account][operator]

(storage) AccountManager.collectFees(address,address).feeData | FeeDataStorageLib.getFeeDataStorage()
(i) (w) 🔗 AccountManager.collectFees | 🎯💥🟢❌ ['onlyOwnerOrRoles(uint256)']#L252 | feeData = FeeDataStorageLib.getFeeDataStorage()
(w) 🔗 FeeDataLib.claimFees | 🎯#L137 | delete self.unclaimedFees[token]
(r) 🔗 FeeDataLib.claimFees | 🎯#L136 | fees = self.unclaimedFees[token]

(storage) AccountManager.setSpotAccountFeeTier(address,FeeTiers).feeData | FeeDataStorageLib.getFeeDataStorage()
(i) (w) 🔗 AccountManager.setSpotAccountFeeTier | 🎯💥❌ ['onlyCLOBManager']#L263 | feeData = FeeDataStorageLib.getFeeDataStorage()
(w) 🔗 FeeDataLib.setAccountFeeTier | 🎯#L121 | self.accountFeeTier[account] = feeTier
(i) (r*) 🔗 AccountManager.setSpotAccountFeeTier | 🎯💥❌ ['onlyCLOBManager']#L264 | feeData.setAccountFeeTier(account,feeTier)
    (🔀?self.accountFeeTier[account]?)  (w) 🔗 FeeManagerLib.setAccountFeeTier | 🎯#L24 | self.accountFeeTier[account] = feeTier

(storage) AccountManager.setSpotAccountFeeTiers(address[],FeeTiers[]).feeData | FeeDataStorageLib.getFeeDataStorage()
(i) (w) 🔗 AccountManager.setSpotAccountFeeTiers | 🎯💥❌ ['onlyCLOBManager']#L275 | feeData = FeeDataStorageLib.getFeeDataStorage()
(w) 🔗 FeeDataLib.setAccountFeeTier | 🎯#L121 | self.accountFeeTier[account] = feeTier
(i) (r*) 🔗 AccountManager.setSpotAccountFeeTiers | 🎯💥❌ ['onlyCLOBManager']#L277 | feeData.setAccountFeeTier(accounts[i],feeTiers[i])
    (🔀?self.accountFeeTier[account]?)  (w) 🔗 FeeManagerLib.setAccountFeeTier | 🎯#L24 | self.accountFeeTier[account] = feeTier

(storage) AccountManager.settleIncomingOrder(ICLOB.SettleParams).self | _getAccountStorage()
(i) (w) 🔗 AccountManager._creditAccount | 🎯#L371 | self.accountTokenBalances[account][token] += amount
(i) (w) 🔗 AccountManager._creditAccountNoEvent | 🎯#L380 | self.accountTokenBalances[account][token] += amount
(i) (w) 🔗 AccountManager._debitAccount | 🎯#L390 | self.accountTokenBalances[account][token] -= amount
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L302 | _debitAccount(self,params.taker,params.quoteToken,params.takerQuoteAmount)
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L303 | _creditAccount(self,params.taker,params.baseToken,params.takerBaseAmount - takerFee)
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L309 | _debitAccount(self,params.taker,params.baseToken,params.takerBaseAmount)
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L310 | _creditAccount(self,params.taker,params.quoteToken,params.takerQuoteAmount - takerFee)
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L336 | _creditAccountNoEvent(self,credit.maker,params.baseToken,credit.baseAmount)
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L339 | _creditAccountNoEvent(self,credit.maker,params.quoteToken,credit.quoteAmount)
(i) (r) 🔗 AccountManager._debitAccount | 🎯#L387 | self.accountTokenBalances[account][token] < amount

(storage) AccountManager.settleIncomingOrder(ICLOB.SettleParams).feeData | FeeDataStorageLib.getFeeDataStorage()
(i) (w) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L293 | feeData = FeeDataStorageLib.getFeeDataStorage()
(w) 🔗 FeeDataLib.accrueFee | 🎯#L128 | self.totalFees[token] += amount
(w) 🔗 FeeDataLib.accrueFee | 🎯#L129 | self.unclaimedFees[token] += amount
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L303 | _creditAccount(self,params.taker,params.baseToken,params.takerBaseAmount - takerFee)
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L310 | _creditAccount(self,params.taker,params.quoteToken,params.takerQuoteAmount - takerFee)
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L314 | feeData.accrueFee(takerFeeToken,takerFee)
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L344 | feeData.accrueFee(params.baseToken,totalBaseMakerFee)
(i) (r*) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L345 | feeData.accrueFee(params.quoteToken,totalQuoteMakerFee)
(i) (r) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L298 | takerFee = feeData.getTakerFee(spotTakerFeeRates,params.taker,params.takerBaseAmount)
(i) (r) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L305 | takerFee = feeData.getTakerFee(spotTakerFeeRates,params.taker,params.takerQuoteAmount)
(i) (r) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L326 | currMakerFee = feeData.getMakerFee(spotMakerFeeRates,credit.maker,credit.quoteAmount)
(i) (r) 🔗 AccountManager.settleIncomingOrder | 🎯💥🟢❌ ['onlyMarket']#L330 | currMakerFee = feeData.getMakerFee(spotMakerFeeRates,credit.maker,credit.baseAmount)
(r) 🔗 FeeDataLib.getMakerFee | 🎯🟢🟩#L110 | feeRate = makerRates.getFeeAt(uint256(self.accountFeeTier[account]))
(r) 🔗 FeeDataLib.getTakerFee | 🎯🟢🟩#L98 | feeRate = takerRates.getFeeAt(uint256(self.accountFeeTier[account]))

(storage) AccountManager._creditAccount(AccountManagerStorage,address,address,uint256).self |
(i) (w) 🔗 AccountManager._creditAccount | 🎯#L371 | self.accountTokenBalances[account][token] += amount

(storage) AccountManager._creditAccountNoEvent(AccountManagerStorage,address,address,uint256).self |
(i) (w) 🔗 AccountManager._creditAccountNoEvent | 🎯#L380 | self.accountTokenBalances[account][token] += amount

(storage) AccountManager._debitAccount(AccountManagerStorage,address,address,uint256).self |
(i) (w) 🔗 AccountManager._debitAccount | 🎯#L390 | self.accountTokenBalances[account][token] -= amount
(i) (r) 🔗 AccountManager._debitAccount | 🎯#L387 | self.accountTokenBalances[account][token] < amount

(storage) AccountManager._getAccountStorage().ds |

Solidity Vars Used

this
this @ 🔗 GTL.disapproveOperator#178:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).disapproveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})
this @ 🔗 AccountManager.depositTo#193:9 | 🎯💥 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 AccountManager.depositFromRouter#207:9 | 🎯💥🟢❌ ['onlyGTERouter'] | token.safeTransferFrom(gteRouter,address(this),amount)
this @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
this @ 🔗 Initializable.initializer#71:17 | 🌈🟢 | ! extcodesize(uint256)(address()()) < i_initializer_asm_0 >> 1 == 1
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)
this @ 🔗 GTL.approveOperator#170:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).approveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})
this @ 🔗 AccountManager.deposit#186:9 | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amount)

msg.sender
msg.sender @ 🔗 AccountManager.depositTo#193:9 | 🎯💥 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 CLOBManager.createMarket#217:9 | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | _emitMarketCreated(msg.sender,marketAddress,quoteDecimals,baseDecimals,config,settings)
msg.sender @ 🔗 AccountManager.withdrawToPerps#221:13 | 🎯💥🟢🌀 | msg.sender != address(perpManager)
msg.sender @ 🔗 OperatorHub.approveOperatorSpot#28:9 | 🎯💥🟢🌀 | accountManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 PerpManager.withdrawToSpot#128:13 | 🎯💥🟢 | msg.sender != address(accountManager)
msg.sender @ 🔗 OperatorHub.approveOperatorPerps#32:9 | 🎯💥🟢🌀 | perpManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 GTERouter.spotDeposit#125:13 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.spotDeposit#127:13 | 🎯💥🟢🌀 | acctManager.deposit(msg.sender,token,amount)
msg.sender @ 🔗 OperatorHub.disapproveOperatorSpot#36:9 | 🎯💥🟢🌀 | accountManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OperatorHub.disapproveOperatorPerps#40:9 | 🎯💥🟢🌀 | perpManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#138:9 | 🎯💥🟢🌀 | permit2.permit(msg.sender,permitSingle,signature)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#141:9 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)
msg.sender @ 🔗 AccountManager.onlyMarket#87:13 | 🎯🌈 | ! _getAccountStorage().isMarket[msg.sender]
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Launchpad.onlySenderOrOperator#144:13 | 🎯🌈🟢 | msg.sender != gteRouter
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 GTERouter.spotWithdraw#153:9 | 🎯💥🟢🌀 | acctManager.withdraw(msg.sender,token,amount)
msg.sender @ 🔗 AccountManager.onlyGTERouter#93:13 | 🎯🌈🟢 | msg.sender != gteRouter
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 AccountManager.onlyCLOBManager#99:13 | 🎯🌈🟢 | msg.sender != clobManager
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#22:13 | 🎯🟩🌀 | msg.sender == account || msg.sender == gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#24:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#33:13 | 🎯🟩🌀 | msg.sender == account
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#35:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#46:13 | 🎯🟩 | msg.sender == account || msg.sender == gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#48:9 | 🎯🟩 | rolesPacked = self.operatorRoleApprovals[account][msg.sender]
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OperatorPanel.onlySenderOrOperatorHub#73:13 | 🎯🌈🟢 | msg.sender != account && msg.sender != operatorHub
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#327:13 | 🎯🟢🌀 | acctManager.withdrawToRouter(msg.sender,route.nextTokenIn,route.prevAmountOut)
msg.sender @ 🔗 GTERouter._accountDepositInternal#355:9 | 🎯🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())

msg.value
msg.value @ 🔗 GTERouter.wrapSpotDeposit#146:9 | 🎯💥🟢🌀💲 | weth.deposit{value: msg.value}()
msg.value @ 🔗 GTERouter.wrapSpotDeposit#147:9 | 🎯💥🟢🌀💲 | address(weth).safeApprove(address(acctManager),msg.value)
msg.value @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)

block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()

External Calls

AccountManager.depositFromPerps | 🎯💥🟢🌀❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | _creditAccount(_getAccountStorage(), account, perpManager.getCollateralAsset(), amount)
AccountManager.depositFromPerps | 🎯💥🟢🌀❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | perpManager.withdrawToSpot(account, amount)
AccountManager.withdrawToPerps | 🎯💥🟢🌀 | address token = perpManager.getCollateralAsset()


modifiers_html

functions_html

AccountManagerStorageLib,/home/ubuntu/2025-08-gte-perps/contracts/account-manager/AccountManager.sol#404:1

state_vars_html

(storage) AccountManagerStorageLib.getAccountManagerStorage().self |

Solidity Vars Used

msg.sender
msg.sender @ 🔗 AccountManager.depositTo#193:9 | 🎯💥 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 GTERouter.spotDeposit#125:13 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.spotDeposit#127:13 | 🎯💥🟢🌀 | acctManager.deposit(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#327:13 | 🎯🟢🌀 | acctManager.withdrawToRouter(msg.sender,route.nextTokenIn,route.prevAmountOut)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#138:9 | 🎯💥🟢🌀 | permit2.permit(msg.sender,permitSingle,signature)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#141:9 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 CLOBManager.createMarket#217:9 | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | _emitMarketCreated(msg.sender,marketAddress,quoteDecimals,baseDecimals,config,settings)
msg.sender @ 🔗 GTERouter._accountDepositInternal#355:9 | 🎯🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)
msg.sender @ 🔗 AccountManager.onlyMarket#87:13 | 🎯🌈 | ! _getAccountStorage().isMarket[msg.sender]
msg.sender @ 🔗 AccountManager.withdrawToPerps#221:13 | 🎯💥🟢🌀 | msg.sender != address(perpManager)
msg.sender @ 🔗 GTERouter.spotWithdraw#153:9 | 🎯💥🟢🌀 | acctManager.withdraw(msg.sender,token,amount)

this
this @ 🔗 AccountManager.depositTo#193:9 | 🎯💥 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 AccountManager.depositFromRouter#207:9 | 🎯💥🟢❌ ['onlyGTERouter'] | token.safeTransferFrom(gteRouter,address(this),amount)
this @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)
this @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
this @ 🔗 AccountManager.deposit#186:9 | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amount)

block.timestamp
block.timestamp @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)

msg.value
msg.value @ 🔗 GTERouter.wrapSpotDeposit#146:9 | 🎯💥🟢🌀💲 | weth.deposit{value: msg.value}()
msg.value @ 🔗 GTERouter.wrapSpotDeposit#147:9 | 🎯💥🟢🌀💲 | address(weth).safeApprove(address(acctManager),msg.value)
msg.value @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)

modifiers_html

functions_html

CLOB,/home/ubuntu/2025-08-gte-perps/contracts/clob/CLOB.sol#28:1

state_vars_html

(storage) Ownable2StepUpgradeable._getOwnable2StepStorage().$ |
(storage) Ownable2StepUpgradeable.pendingOwner().$ | _getOwnable2StepStorage()
(w) 🔗 Ownable2StepUpgradeable.pendingOwner | 💥🟩#L52 | $ = _getOwnable2StepStorage()

(storage) Ownable2StepUpgradeable.transferOwnership(address).$ | _getOwnable2StepStorage()
(storage) Ownable2StepUpgradeable._transferOwnership(address).$ | _getOwnable2StepStorage()
(w) 🔗 Ownable2StepUpgradeable._transferOwnership | #L73 | $ = _getOwnable2StepStorage()

(storage) OwnableUpgradeable._getOwnableStorage().$ |
(storage) OwnableUpgradeable.owner().$ | _getOwnableStorage()
(w) 🔗 OwnableUpgradeable.owner | 💥🟩#L74 | $ = _getOwnableStorage()

(storage) OwnableUpgradeable._transferOwnership(address).$ | _getOwnableStorage()
(w) 🔗 OwnableUpgradeable._transferOwnership | #L114 | $ = _getOwnableStorage()

(storage) Initializable._disableInitializers().$ | _getInitializableStorage()
(storage) Initializable._getInitializableStorage().$ |
(storage) CLOB.getOrdersPaginated(uint256,Side,uint256).ds | _getStorage()
(i) (w) 🔗 CLOB.getOrdersPaginated | 🎯💥🟩#L265 | ds = _getStorage()
(i) (r) 🔗 CLOB.getOrdersPaginated | 🎯💥🟩#L267 | nextOrder = ds.orders[ds.bidLimits[startPrice].headOrder]
(i) (r) 🔗 CLOB.getOrdersPaginated | 🎯💥🟩#L271 | ds.getOrdersPaginated(nextOrder,pageSize)
(r) 🔗 BookLib.getOrdersPaginated | 🎯🟩#L238 | nextOrder = ds.orders[ds.bidLimits[ds.getNextSmallestPrice(nextOrder.price,Side.BUY)].headOrder]
(r) 🔗 BookLib.getOrdersPaginated | 🎯🟩#L242 | nextOrder = ds.orders[nextOrder.nextOrderId]
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOB.getOrdersPaginated(OrderId,uint256).ds | _getStorage()
(i) (w) 🔗 CLOB.getOrdersPaginated | 🎯💥🟩#L280 | ds = _getStorage()
(i) (r) 🔗 CLOB.getOrdersPaginated | 🎯💥🟩#L281 | nextOrder = ds.orders[startOrderId]
(i) (r) 🔗 CLOB.getOrdersPaginated | 🎯💥🟩#L283 | ds.getOrdersPaginated(nextOrder,pageSize)
(r) 🔗 BookLib.getOrdersPaginated | 🎯🟩#L238 | nextOrder = ds.orders[ds.bidLimits[ds.getNextSmallestPrice(nextOrder.price,Side.BUY)].headOrder]
(r) 🔗 BookLib.getOrdersPaginated | 🎯🟩#L242 | nextOrder = ds.orders[nextOrder.nextOrderId]
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOB.adminCancelExpiredOrders(OrderId[],Side).ds | _getStorage()
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB.adminCancelExpiredOrders | 🎯💥❌ ['onlyManager']#L336 | _settleIncomingOrder({ds:ds,account:address(0),side:virtualTakerSide,quoteTokenAmount:0,baseTokenAmount:0})
(i) (r*) 🔗 CLOB._removeExpiredAsk | 🎯#L854 | ds.removeOrderFromBook(order)
(i) (r*) 🔗 CLOB._removeExpiredBid | 🎯#L864 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB.adminCancelExpiredOrders | 🎯💥❌ ['onlyManager']#L328 | ! o.isExpired() || o.side != side
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._settleIncomingOrder | 🎯🟢🌀#L944 | (settleParams.quoteToken,settleParams.baseToken) = (ds.config().quoteToken,ds.config().baseToken)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOB.adminCancelExpiredOrders(OrderId[],Side).o | ds.orders[ids[i]]
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r) 🔗 CLOB.adminCancelExpiredOrders | 🎯💥❌ ['onlyManager']#L328 | ! o.isExpired() || o.side != side
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId

(storage) CLOB.placeOrder(address,ICLOB.PlaceOrderArgs).ds | _getStorage()
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L289 | self.orders[order.id] = order
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L296 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L297 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L300 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L301 | self.orders[order.id].prevOrderId = tailOrder.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L302 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._processBid | 🎯#L420 | (postAmount,totalQuoteSent,totalBaseReceived) = _executeBid(ds,newOrder,args.tif,args.baseDenominated)
(i) (r*) 🔗 CLOB._processBid | 🎯#L429 | takerFee = _settleIncomingOrder(ds,account,Side.BUY,totalQuoteSent + postAmount,totalBaseReceived)
(i) (r*) 🔗 CLOB._processAsk | 🎯#L462 | (postAmount,totalQuoteReceived,totalBaseSent) = _executeAsk(ds,newOrder,args.tif,args.baseDenominated)
(i) (r*) 🔗 CLOB._processAsk | 🎯#L471 | takerFee = _settleIncomingOrder(ds,account,Side.SELL,totalQuoteReceived,totalBaseSent + postAmount)
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L508 | (totalQuoteSent,totalBaseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L533 | _removeNonCompetitiveOrder(ds,ds.orders[ds.bidLimits[minBidPrice].tailOrder])
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L549 | (totalQuoteReceived,totalBaseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L574 | _removeNonCompetitiveOrder(ds,ds.orders[ds.askLimits[maxAskPrice].tailOrder])
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L733 | currMatch = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,bestAskPrice,amountIsBase)
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L763 | currMatch = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,bestBidPrice,amountIsBase)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L159 | limit = _updateBookPostOrder(self,order)
(i) (r) 🔗 CLOB.placeOrder | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)']#L366 | newOrder = args.toOrderChecked(orderId,account)
(i) (r) 🔗 CLOB._processBid | 🎯#L423 | postAmount + totalQuoteSent + totalBaseReceived == 0
(i) (r) 🔗 CLOB._processBid | 🎯#L425 | totalBaseReceived != totalQuoteSent && (totalBaseReceived == 0 || totalQuoteSent == 0)
(i) (r) 🔗 CLOB._processBid | 🎯#L434 | res.quoteTokenAmountTraded = - int256(totalQuoteSent)
(i) (r) 🔗 CLOB._processBid | 🎯#L435 | res.baseTokenAmountTraded = int256(totalBaseReceived)
(i) (r) 🔗 CLOB._processBid | 🎯#L436 | res.takerFee = takerFee
(i) (r) 🔗 CLOB._processAsk | 🎯#L465 | postAmount + totalQuoteReceived + totalBaseSent == 0
(i) (r) 🔗 CLOB._processAsk | 🎯#L467 | totalBaseSent != totalQuoteReceived && (totalBaseSent == 0 || totalQuoteReceived == 0)
(i) (r) 🔗 CLOB._processAsk | 🎯#L476 | res.quoteTokenAmountTraded = int256(totalQuoteReceived)
(i) (r) 🔗 CLOB._processAsk | 🎯#L477 | res.baseTokenAmountTraded = - int256(totalBaseSent)
(i) (r) 🔗 CLOB._processAsk | 🎯#L478 | res.takerFee = takerFee
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L506 | ds.getBestAskPrice() <= newOrder.price
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L514 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteSent | totalBaseReceived > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L529 | ds.metadata().numBids == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L530 | minBidPrice = ds.getWorstBidPrice()
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L531 | newOrder.price <= minBidPrice
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L537 | postAmount = ds.getQuoteTokenAmount(newOrder.price,newOrder.amount)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L547 | ds.getBestBidPrice() >= newOrder.price
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L555 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteReceived | totalBaseSent > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L570 | ds.metadata().numAsks == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L571 | maxAskPrice = ds.getWorstAskPrice()
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L572 | newOrder.price >= maxAskPrice
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L595 | remainingAmount = ds.boundToLots(remainingAmount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L600 | remainingAmount < ds.settings().minLimitOrderAmountInBase
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L720 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L722 | bestAskPrice <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L723 | limit = ds.askLimits[bestAskPrice]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L724 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L726 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L728 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L736 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L738 | totalQuoteSent += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L739 | totalBaseReceived += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L741 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L750 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L752 | bestBidPrice >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L753 | limit = ds.bidLimits[bestBidPrice]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L754 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L756 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L758 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L766 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L768 | totalQuoteReceived += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L769 | totalBaseSent += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L771 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L871 | order.side == Side.BUY
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L872 | quoteRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L873 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().quoteToken),quoteRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L875 | baseRefunded = order.amount
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L876 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().baseToken),baseRefunded)
(i) (r) 🔗 CLOB._settleIncomingOrder | 🎯🟢🌀#L944 | (settleParams.quoteToken,settleParams.baseToken) = (ds.config().quoteToken,ds.config().baseToken)
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L104 | tickSize = self.settings().tickSize
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L106 | price % tickSize > 0 || price == 0
(r) 🔗 BookLib.assertUnusedOrderId | 🎯🟩#L121 | self.orders[orderId.toOrderId()].owner > address(0)
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L140 | limitsPlaced >= self.settings().maxLimitsPerTx && ! isMaxLimitExempt(self,factory,account)
(r) 🔗 BookLib.boundToLots | 🎯🟩#L173 | lotSize = self.settings().lotSizeInBase
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L278 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L280 | self.metadata().numBids ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L281 | self.metadata().quoteTokenOpenInterest += self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L283 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L285 | self.metadata().numAsks ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L286 | self.metadata().baseTokenOpenInterest += order.amount
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L295 | limit.headOrder.isNull()
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L299 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB.amend(address,ICLOB.AmendArgs).ds | _getStorage()
(i) (w) 🔗 CLOB._processAmend | 🎯#L639 | order.cancelTimestamp = uint32(args.cancelTimestamp)
(i) (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
(i) (w) 🔗 CLOB._executeAmendAmount | 🎯#L701 | order.cancelTimestamp = cancelTimestamp
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L289 | self.orders[order.id] = order
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L296 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L297 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L300 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L301 | self.orders[order.id].prevOrderId = tailOrder.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L302 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB.amend | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)']#L391 | (quoteDelta,baseDelta) = _processAmend(ds,order,args)
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L508 | (totalQuoteSent,totalBaseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L533 | _removeNonCompetitiveOrder(ds,ds.orders[ds.bidLimits[minBidPrice].tailOrder])
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L549 | (totalQuoteReceived,totalBaseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L574 | _removeNonCompetitiveOrder(ds,ds.orders[ds.askLimits[maxAskPrice].tailOrder])
(i) (r*) 🔗 CLOB._processAmend | 🎯#L633 | (quoteTokenDelta,baseTokenDelta) = _executeAmendNewOrder(ds,order,args)
(i) (r*) 🔗 CLOB._processAmend | 🎯#L636 | (quoteTokenDelta,baseTokenDelta) = _executeAmendAmount(ds,order,args.amountInBase,uint32(args.cancelTimestamp))
(i) (r*) 🔗 CLOB._executeAmendNewOrder | 🎯#L666 | ds.removeOrderFromBook(order)
(i) (r*) 🔗 CLOB._executeAmendNewOrder | 🎯#L670 | (postAmount,None,None) = _executeBid(ds,newOrder,ICLOB.TiF.MOC,true)
(i) (r*) 🔗 CLOB._executeAmendNewOrder | 🎯#L674 | (postAmount,None,None) = _executeAsk(ds,newOrder,ICLOB.TiF.MOC,true)
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L733 | currMatch = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,bestAskPrice,amountIsBase)
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L763 | currMatch = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,bestBidPrice,amountIsBase)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L159 | limit = _updateBookPostOrder(self,order)
(i) (r) 🔗 CLOB.amend | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)']#L380 | order = ds.orders[args.orderId.toOrderId()]
(i) (r) 🔗 CLOB.amend | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)']#L386 | ds.assertMakeAmountInBounds(args.amountInBase)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L506 | ds.getBestAskPrice() <= newOrder.price
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L514 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteSent | totalBaseReceived > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L529 | ds.metadata().numBids == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L530 | minBidPrice = ds.getWorstBidPrice()
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L531 | newOrder.price <= minBidPrice
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L537 | postAmount = ds.getQuoteTokenAmount(newOrder.price,newOrder.amount)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L547 | ds.getBestBidPrice() >= newOrder.price
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L555 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteReceived | totalBaseSent > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L570 | ds.metadata().numAsks == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L571 | maxAskPrice = ds.getWorstAskPrice()
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L572 | newOrder.price >= maxAskPrice
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L595 | remainingAmount = ds.boundToLots(remainingAmount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L600 | remainingAmount < ds.settings().minLimitOrderAmountInBase
(i) (r) 🔗 CLOB._processAmend | 🎯#L621 | preAmend = order
(i) (r) 🔗 CLOB._processAmend | 🎯#L622 | maker = preAmend.owner
(i) (r) 🔗 CLOB._processAmend | 🎯#L624 | args.cancelTimestamp.isExpired() || args.amountInBase < ds.settings().minLimitOrderAmountInBase
(i) (r) 🔗 CLOB._processAmend | 🎯#L631 | order.side != args.side || order.price != args.price
(i) (r) 🔗 CLOB._processAmend | 🎯#L634 | order.amount != args.amountInBase
(i) (r) 🔗 CLOB._processAmend | 🎯#L638 | args.cancelTimestamp != order.cancelTimestamp
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L656 | newOrder.owner = order.owner
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L657 | newOrder.id = order.id
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L663 | quoteTokenDelta = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L663 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L664 | baseTokenDelta = order.amount.toInt256()
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L672 | quoteTokenDelta -= postAmount.toInt256()
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L676 | baseTokenDelta -= postAmount.toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L685 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L686 | oldAmountInQuote = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L687 | newAmountInQuote = ds.getQuoteTokenAmount(order.price,amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L689 | quoteTokenDelta = oldAmountInQuote - newAmountInQuote
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L691 | ds.metadata().quoteTokenOpenInterest = uint256(ds.metadata().quoteTokenOpenInterest.toInt256() - quoteTokenDelta)
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L694 | baseTokenDelta = order.amount.toInt256() - amount.toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L696 | ds.metadata().baseTokenOpenInterest = uint256(ds.metadata().baseTokenOpenInterest.toInt256() - baseTokenDelta)
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L720 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L722 | bestAskPrice <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L723 | limit = ds.askLimits[bestAskPrice]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L724 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L726 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L728 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L736 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L738 | totalQuoteSent += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L739 | totalBaseReceived += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L741 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L750 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L752 | bestBidPrice >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L753 | limit = ds.bidLimits[bestBidPrice]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L754 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L756 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L758 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L766 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L768 | totalQuoteReceived += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L769 | totalBaseSent += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L771 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L871 | order.side == Side.BUY
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L872 | quoteRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L873 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().quoteToken),quoteRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L875 | baseRefunded = order.amount
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L876 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().baseToken),baseRefunded)
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L960 | accountManager.creditAccount(maker,address(ds.config().quoteToken),uint256(quoteTokenDelta))
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L962 | accountManager.debitAccount(maker,address(ds.config().quoteToken),uint256(- quoteTokenDelta))
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L966 | accountManager.creditAccount(maker,address(ds.config().baseToken),uint256(baseTokenDelta))
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L968 | accountManager.debitAccount(maker,address(ds.config().baseToken),uint256(- baseTokenDelta))
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L104 | tickSize = self.settings().tickSize
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L106 | price % tickSize > 0 || price == 0
(r) 🔗 BookLib.assertLotSizeCompliant | 🎯🟩#L110 | amount % self.settings().lotSizeInBase > 0
(r) 🔗 BookLib.assertMakeAmountInBounds | 🎯🟩#L115 | orderAmountInBase < self.settings().minLimitOrderAmountInBase
(r) 🔗 BookLib.assertMakeAmountInBounds | 🎯🟩#L116 | orderAmountInBase % self.settings().lotSizeInBase != 0
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L140 | limitsPlaced >= self.settings().maxLimitsPerTx && ! isMaxLimitExempt(self,factory,account)
(r) 🔗 BookLib.boundToLots | 🎯🟩#L173 | lotSize = self.settings().lotSizeInBase
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L278 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L280 | self.metadata().numBids ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L281 | self.metadata().quoteTokenOpenInterest += self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L283 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L285 | self.metadata().numAsks ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L286 | self.metadata().baseTokenOpenInterest += order.amount
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L295 | limit.headOrder.isNull()
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L299 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB.amend(address,ICLOB.AmendArgs).order | ds.orders[args.orderId.toOrderId()]
(i) (w) 🔗 CLOB.amend | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)']#L380 | order = ds.orders[args.orderId.toOrderId()]
(i) (w) 🔗 CLOB._processAmend | 🎯#L639 | order.cancelTimestamp = uint32(args.cancelTimestamp)
(i) (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
(i) (w) 🔗 CLOB._executeAmendAmount | 🎯#L701 | order.cancelTimestamp = cancelTimestamp
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB.amend | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)']#L391 | (quoteDelta,baseDelta) = _processAmend(ds,order,args)
(i) (r*) 🔗 CLOB._processAmend | 🎯#L633 | (quoteTokenDelta,baseTokenDelta) = _executeAmendNewOrder(ds,order,args)
(i) (r*) 🔗 CLOB._processAmend | 🎯#L636 | (quoteTokenDelta,baseTokenDelta) = _executeAmendAmount(ds,order,args.amountInBase,uint32(args.cancelTimestamp))
(i) (r) 🔗 CLOB._processAmend | 🎯#L621 | preAmend = order
(i) (r) 🔗 CLOB._processAmend | 🎯#L622 | maker = preAmend.owner
(i) (r) 🔗 CLOB._processAmend | 🎯#L631 | order.side != args.side || order.price != args.price
(i) (r) 🔗 CLOB._processAmend | 🎯#L634 | order.amount != args.amountInBase
(i) (r) 🔗 CLOB._processAmend | 🎯#L638 | args.cancelTimestamp != order.cancelTimestamp
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L656 | newOrder.owner = order.owner
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L657 | newOrder.id = order.id
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L663 | quoteTokenDelta = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L663 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L664 | baseTokenDelta = order.amount.toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L685 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L686 | oldAmountInQuote = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L687 | newAmountInQuote = ds.getQuoteTokenAmount(order.price,amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L689 | quoteTokenDelta = oldAmountInQuote - newAmountInQuote
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L691 | ds.metadata().quoteTokenOpenInterest = uint256(ds.metadata().quoteTokenOpenInterest.toInt256() - quoteTokenDelta)
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L694 | baseTokenDelta = order.amount.toInt256() - amount.toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L696 | ds.metadata().baseTokenOpenInterest = uint256(ds.metadata().baseTokenOpenInterest.toInt256() - baseTokenDelta)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB.cancel(address,ICLOB.CancelArgs).ds | _getStorage()
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB.cancel | 🎯💥🟢🌀❌ ['onlySenderOrOperator(address,SpotOperatorRoles)']#L403 | (totalQuoteTokenRefunded,totalBaseTokenRefunded) = _executeCancel(ds,account,args)
(i) (r) 🔗 CLOB._executeCancel | 🎯#L903 | order = ds.orders[orderId.toOrderId()]
(i) (r) 🔗 CLOB._executeCancel | 🎯#L905 | order.isNull()
(i) (r) 🔗 CLOB._executeCancel | 🎯#L908 | order.owner != account
(i) (r) 🔗 CLOB._executeCancel | 🎯#L915 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeCancel | 🎯#L916 | quoteTokenRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._executeCancel | 🎯#L917 | totalQuoteTokenRefunded += quoteTokenRefunded
(i) (r) 🔗 CLOB._executeCancel | 🎯#L919 | baseTokenRefunded = order.amount
(i) (r) 🔗 CLOB._executeCancel | 🎯#L920 | totalBaseTokenRefunded += baseTokenRefunded
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOB._processBid(Book,address,Order,ICLOB.PlaceOrderArgs).ds |
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L289 | self.orders[order.id] = order
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L296 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L297 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L300 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L301 | self.orders[order.id].prevOrderId = tailOrder.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L302 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._processBid | 🎯#L420 | (postAmount,totalQuoteSent,totalBaseReceived) = _executeBid(ds,newOrder,args.tif,args.baseDenominated)
(i) (r*) 🔗 CLOB._processBid | 🎯#L429 | takerFee = _settleIncomingOrder(ds,account,Side.BUY,totalQuoteSent + postAmount,totalBaseReceived)
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L508 | (totalQuoteSent,totalBaseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L533 | _removeNonCompetitiveOrder(ds,ds.orders[ds.bidLimits[minBidPrice].tailOrder])
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L733 | currMatch = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,bestAskPrice,amountIsBase)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L159 | limit = _updateBookPostOrder(self,order)
(i) (r) 🔗 CLOB._processBid | 🎯#L423 | postAmount + totalQuoteSent + totalBaseReceived == 0
(i) (r) 🔗 CLOB._processBid | 🎯#L425 | totalBaseReceived != totalQuoteSent && (totalBaseReceived == 0 || totalQuoteSent == 0)
(i) (r) 🔗 CLOB._processBid | 🎯#L434 | res.quoteTokenAmountTraded = - int256(totalQuoteSent)
(i) (r) 🔗 CLOB._processBid | 🎯#L435 | res.baseTokenAmountTraded = int256(totalBaseReceived)
(i) (r) 🔗 CLOB._processBid | 🎯#L436 | res.takerFee = takerFee
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L506 | ds.getBestAskPrice() <= newOrder.price
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L514 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteSent | totalBaseReceived > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L529 | ds.metadata().numBids == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L530 | minBidPrice = ds.getWorstBidPrice()
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L531 | newOrder.price <= minBidPrice
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L537 | postAmount = ds.getQuoteTokenAmount(newOrder.price,newOrder.amount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L595 | remainingAmount = ds.boundToLots(remainingAmount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L600 | remainingAmount < ds.settings().minLimitOrderAmountInBase
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L720 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L722 | bestAskPrice <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L723 | limit = ds.askLimits[bestAskPrice]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L724 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L726 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L728 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L736 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L738 | totalQuoteSent += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L739 | totalBaseReceived += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L741 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L871 | order.side == Side.BUY
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L872 | quoteRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L873 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().quoteToken),quoteRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L875 | baseRefunded = order.amount
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L876 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().baseToken),baseRefunded)
(i) (r) 🔗 CLOB._settleIncomingOrder | 🎯🟢🌀#L944 | (settleParams.quoteToken,settleParams.baseToken) = (ds.config().quoteToken,ds.config().baseToken)
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L104 | tickSize = self.settings().tickSize
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L106 | price % tickSize > 0 || price == 0
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L140 | limitsPlaced >= self.settings().maxLimitsPerTx && ! isMaxLimitExempt(self,factory,account)
(r) 🔗 BookLib.boundToLots | 🎯🟩#L173 | lotSize = self.settings().lotSizeInBase
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L278 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L280 | self.metadata().numBids ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L281 | self.metadata().quoteTokenOpenInterest += self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L283 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L285 | self.metadata().numAsks ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L286 | self.metadata().baseTokenOpenInterest += order.amount
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L295 | limit.headOrder.isNull()
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L299 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._processAsk(Book,address,Order,ICLOB.PlaceOrderArgs).ds |
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L289 | self.orders[order.id] = order
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L296 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L297 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L300 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L301 | self.orders[order.id].prevOrderId = tailOrder.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L302 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._processAsk | 🎯#L462 | (postAmount,totalQuoteReceived,totalBaseSent) = _executeAsk(ds,newOrder,args.tif,args.baseDenominated)
(i) (r*) 🔗 CLOB._processAsk | 🎯#L471 | takerFee = _settleIncomingOrder(ds,account,Side.SELL,totalQuoteReceived,totalBaseSent + postAmount)
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L549 | (totalQuoteReceived,totalBaseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L574 | _removeNonCompetitiveOrder(ds,ds.orders[ds.askLimits[maxAskPrice].tailOrder])
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L763 | currMatch = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,bestBidPrice,amountIsBase)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L159 | limit = _updateBookPostOrder(self,order)
(i) (r) 🔗 CLOB._processAsk | 🎯#L465 | postAmount + totalQuoteReceived + totalBaseSent == 0
(i) (r) 🔗 CLOB._processAsk | 🎯#L467 | totalBaseSent != totalQuoteReceived && (totalBaseSent == 0 || totalQuoteReceived == 0)
(i) (r) 🔗 CLOB._processAsk | 🎯#L476 | res.quoteTokenAmountTraded = int256(totalQuoteReceived)
(i) (r) 🔗 CLOB._processAsk | 🎯#L477 | res.baseTokenAmountTraded = - int256(totalBaseSent)
(i) (r) 🔗 CLOB._processAsk | 🎯#L478 | res.takerFee = takerFee
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L547 | ds.getBestBidPrice() >= newOrder.price
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L555 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteReceived | totalBaseSent > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L570 | ds.metadata().numAsks == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L571 | maxAskPrice = ds.getWorstAskPrice()
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L572 | newOrder.price >= maxAskPrice
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L595 | remainingAmount = ds.boundToLots(remainingAmount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L600 | remainingAmount < ds.settings().minLimitOrderAmountInBase
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L750 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L752 | bestBidPrice >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L753 | limit = ds.bidLimits[bestBidPrice]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L754 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L756 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L758 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L766 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L768 | totalQuoteReceived += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L769 | totalBaseSent += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L771 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L871 | order.side == Side.BUY
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L872 | quoteRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L873 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().quoteToken),quoteRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L875 | baseRefunded = order.amount
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L876 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().baseToken),baseRefunded)
(i) (r) 🔗 CLOB._settleIncomingOrder | 🎯🟢🌀#L944 | (settleParams.quoteToken,settleParams.baseToken) = (ds.config().quoteToken,ds.config().baseToken)
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L104 | tickSize = self.settings().tickSize
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L106 | price % tickSize > 0 || price == 0
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L140 | limitsPlaced >= self.settings().maxLimitsPerTx && ! isMaxLimitExempt(self,factory,account)
(r) 🔗 BookLib.boundToLots | 🎯🟩#L173 | lotSize = self.settings().lotSizeInBase
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L278 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L280 | self.metadata().numBids ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L281 | self.metadata().quoteTokenOpenInterest += self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L283 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L285 | self.metadata().numAsks ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L286 | self.metadata().baseTokenOpenInterest += order.amount
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L295 | limit.headOrder.isNull()
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L299 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._executeBid(Book,Order,ICLOB.TiF,bool).ds |
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L289 | self.orders[order.id] = order
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L296 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L297 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L300 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L301 | self.orders[order.id].prevOrderId = tailOrder.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L302 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L508 | (totalQuoteSent,totalBaseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L533 | _removeNonCompetitiveOrder(ds,ds.orders[ds.bidLimits[minBidPrice].tailOrder])
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L536 | ds.addOrderToBook(newOrder)
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L733 | currMatch = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,bestAskPrice,amountIsBase)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L159 | limit = _updateBookPostOrder(self,order)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L506 | ds.getBestAskPrice() <= newOrder.price
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L514 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteSent | totalBaseReceived > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L523 | ds.assertLimitPriceInBounds(newOrder.price)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L526 | ds.incrementLimitsPlaced(address(factory),msg.sender)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L529 | ds.metadata().numBids == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L530 | minBidPrice = ds.getWorstBidPrice()
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L531 | newOrder.price <= minBidPrice
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L537 | postAmount = ds.getQuoteTokenAmount(newOrder.price,newOrder.amount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L595 | remainingAmount = ds.boundToLots(remainingAmount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L600 | remainingAmount < ds.settings().minLimitOrderAmountInBase
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L720 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L722 | bestAskPrice <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L723 | limit = ds.askLimits[bestAskPrice]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L724 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L726 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L728 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L736 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L738 | totalQuoteSent += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L739 | totalBaseReceived += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L741 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L871 | order.side == Side.BUY
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L872 | quoteRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L873 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().quoteToken),quoteRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L875 | baseRefunded = order.amount
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L876 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().baseToken),baseRefunded)
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L104 | tickSize = self.settings().tickSize
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L106 | price % tickSize > 0 || price == 0
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L140 | limitsPlaced >= self.settings().maxLimitsPerTx && ! isMaxLimitExempt(self,factory,account)
(r) 🔗 BookLib.boundToLots | 🎯🟩#L173 | lotSize = self.settings().lotSizeInBase
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L278 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L280 | self.metadata().numBids ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L281 | self.metadata().quoteTokenOpenInterest += self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L283 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L285 | self.metadata().numAsks ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L286 | self.metadata().baseTokenOpenInterest += order.amount
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L295 | limit.headOrder.isNull()
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L299 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._executeAsk(Book,Order,ICLOB.TiF,bool).ds |
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L289 | self.orders[order.id] = order
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L296 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L297 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L300 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L301 | self.orders[order.id].prevOrderId = tailOrder.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L302 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L549 | (totalQuoteReceived,totalBaseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L574 | _removeNonCompetitiveOrder(ds,ds.orders[ds.askLimits[maxAskPrice].tailOrder])
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L577 | ds.addOrderToBook(newOrder)
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L763 | currMatch = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,bestBidPrice,amountIsBase)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L159 | limit = _updateBookPostOrder(self,order)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L547 | ds.getBestBidPrice() >= newOrder.price
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L555 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteReceived | totalBaseSent > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L564 | ds.assertLimitPriceInBounds(newOrder.price)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L567 | ds.incrementLimitsPlaced(address(factory),msg.sender)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L570 | ds.metadata().numAsks == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L571 | maxAskPrice = ds.getWorstAskPrice()
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L572 | newOrder.price >= maxAskPrice
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L595 | remainingAmount = ds.boundToLots(remainingAmount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L600 | remainingAmount < ds.settings().minLimitOrderAmountInBase
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L750 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L752 | bestBidPrice >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L753 | limit = ds.bidLimits[bestBidPrice]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L754 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L756 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L758 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L766 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L768 | totalQuoteReceived += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L769 | totalBaseSent += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L771 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L871 | order.side == Side.BUY
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L872 | quoteRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L873 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().quoteToken),quoteRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L875 | baseRefunded = order.amount
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L876 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().baseToken),baseRefunded)
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L104 | tickSize = self.settings().tickSize
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L106 | price % tickSize > 0 || price == 0
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L140 | limitsPlaced >= self.settings().maxLimitsPerTx && ! isMaxLimitExempt(self,factory,account)
(r) 🔗 BookLib.boundToLots | 🎯🟩#L173 | lotSize = self.settings().lotSizeInBase
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L278 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L280 | self.metadata().numBids ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L281 | self.metadata().quoteTokenOpenInterest += self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L283 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L285 | self.metadata().numAsks ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L286 | self.metadata().baseTokenOpenInterest += order.amount
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L295 | limit.headOrder.isNull()
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L299 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._getTakeOrPostAmount(Book,ICLOB.TiF,uint256,bool,bool,uint256).ds |
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L595 | remainingAmount = ds.boundToLots(remainingAmount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L600 | remainingAmount < ds.settings().minLimitOrderAmountInBase
(r) 🔗 BookLib.boundToLots | 🎯🟩#L173 | lotSize = self.settings().lotSizeInBase

(storage) CLOB._processAmend(Book,Order,ICLOB.AmendArgs).order |
(i) (w) 🔗 CLOB._processAmend | 🎯#L639 | order.cancelTimestamp = uint32(args.cancelTimestamp)
(i) (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
(i) (w) 🔗 CLOB._executeAmendAmount | 🎯#L701 | order.cancelTimestamp = cancelTimestamp
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._processAmend | 🎯#L633 | (quoteTokenDelta,baseTokenDelta) = _executeAmendNewOrder(ds,order,args)
(i) (r*) 🔗 CLOB._processAmend | 🎯#L636 | (quoteTokenDelta,baseTokenDelta) = _executeAmendAmount(ds,order,args.amountInBase,uint32(args.cancelTimestamp))
(i) (r) 🔗 CLOB._processAmend | 🎯#L621 | preAmend = order
(i) (r) 🔗 CLOB._processAmend | 🎯#L622 | maker = preAmend.owner
(i) (r) 🔗 CLOB._processAmend | 🎯#L631 | order.side != args.side || order.price != args.price
(i) (r) 🔗 CLOB._processAmend | 🎯#L634 | order.amount != args.amountInBase
(i) (r) 🔗 CLOB._processAmend | 🎯#L638 | args.cancelTimestamp != order.cancelTimestamp
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L656 | newOrder.owner = order.owner
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L657 | newOrder.id = order.id
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L663 | quoteTokenDelta = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L663 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L664 | baseTokenDelta = order.amount.toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L685 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L686 | oldAmountInQuote = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L687 | newAmountInQuote = ds.getQuoteTokenAmount(order.price,amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L689 | quoteTokenDelta = oldAmountInQuote - newAmountInQuote
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L691 | ds.metadata().quoteTokenOpenInterest = uint256(ds.metadata().quoteTokenOpenInterest.toInt256() - quoteTokenDelta)
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L694 | baseTokenDelta = order.amount.toInt256() - amount.toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L696 | ds.metadata().baseTokenOpenInterest = uint256(ds.metadata().baseTokenOpenInterest.toInt256() - baseTokenDelta)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._processAmend(Book,Order,ICLOB.AmendArgs).ds |
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L289 | self.orders[order.id] = order
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L296 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L297 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L300 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L301 | self.orders[order.id].prevOrderId = tailOrder.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L302 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L508 | (totalQuoteSent,totalBaseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L533 | _removeNonCompetitiveOrder(ds,ds.orders[ds.bidLimits[minBidPrice].tailOrder])
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L549 | (totalQuoteReceived,totalBaseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L574 | _removeNonCompetitiveOrder(ds,ds.orders[ds.askLimits[maxAskPrice].tailOrder])
(i) (r*) 🔗 CLOB._processAmend | 🎯#L633 | (quoteTokenDelta,baseTokenDelta) = _executeAmendNewOrder(ds,order,args)
(i) (r*) 🔗 CLOB._processAmend | 🎯#L636 | (quoteTokenDelta,baseTokenDelta) = _executeAmendAmount(ds,order,args.amountInBase,uint32(args.cancelTimestamp))
(i) (r*) 🔗 CLOB._processAmend | 🎯#L646 | _settleAmend(ds,maker,quoteTokenDelta,baseTokenDelta)
(i) (r*) 🔗 CLOB._executeAmendNewOrder | 🎯#L670 | (postAmount,None,None) = _executeBid(ds,newOrder,ICLOB.TiF.MOC,true)
(i) (r*) 🔗 CLOB._executeAmendNewOrder | 🎯#L674 | (postAmount,None,None) = _executeAsk(ds,newOrder,ICLOB.TiF.MOC,true)
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L733 | currMatch = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,bestAskPrice,amountIsBase)
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L763 | currMatch = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,bestBidPrice,amountIsBase)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L159 | limit = _updateBookPostOrder(self,order)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L506 | ds.getBestAskPrice() <= newOrder.price
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L514 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteSent | totalBaseReceived > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L529 | ds.metadata().numBids == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L530 | minBidPrice = ds.getWorstBidPrice()
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L531 | newOrder.price <= minBidPrice
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L537 | postAmount = ds.getQuoteTokenAmount(newOrder.price,newOrder.amount)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L547 | ds.getBestBidPrice() >= newOrder.price
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L555 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteReceived | totalBaseSent > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L570 | ds.metadata().numAsks == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L571 | maxAskPrice = ds.getWorstAskPrice()
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L572 | newOrder.price >= maxAskPrice
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L595 | remainingAmount = ds.boundToLots(remainingAmount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L600 | remainingAmount < ds.settings().minLimitOrderAmountInBase
(i) (r) 🔗 CLOB._processAmend | 🎯#L624 | args.cancelTimestamp.isExpired() || args.amountInBase < ds.settings().minLimitOrderAmountInBase
(i) (r) 🔗 CLOB._processAmend | 🎯#L629 | ds.assertLotSizeCompliant(args.amountInBase)
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L663 | quoteTokenDelta = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L672 | quoteTokenDelta -= postAmount.toInt256()
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L676 | baseTokenDelta -= postAmount.toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L686 | oldAmountInQuote = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L687 | newAmountInQuote = ds.getQuoteTokenAmount(order.price,amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L689 | quoteTokenDelta = oldAmountInQuote - newAmountInQuote
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L691 | ds.metadata().quoteTokenOpenInterest = uint256(ds.metadata().quoteTokenOpenInterest.toInt256() - quoteTokenDelta)
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L696 | ds.metadata().baseTokenOpenInterest = uint256(ds.metadata().baseTokenOpenInterest.toInt256() - baseTokenDelta)
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L720 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L722 | bestAskPrice <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L723 | limit = ds.askLimits[bestAskPrice]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L724 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L726 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L728 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L736 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L738 | totalQuoteSent += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L739 | totalBaseReceived += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L741 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L750 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L752 | bestBidPrice >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L753 | limit = ds.bidLimits[bestBidPrice]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L754 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L756 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L758 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L766 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L768 | totalQuoteReceived += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L769 | totalBaseSent += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L771 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L871 | order.side == Side.BUY
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L872 | quoteRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L873 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().quoteToken),quoteRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L875 | baseRefunded = order.amount
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L876 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().baseToken),baseRefunded)
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L960 | accountManager.creditAccount(maker,address(ds.config().quoteToken),uint256(quoteTokenDelta))
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L962 | accountManager.debitAccount(maker,address(ds.config().quoteToken),uint256(- quoteTokenDelta))
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L966 | accountManager.creditAccount(maker,address(ds.config().baseToken),uint256(baseTokenDelta))
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L968 | accountManager.debitAccount(maker,address(ds.config().baseToken),uint256(- baseTokenDelta))
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L104 | tickSize = self.settings().tickSize
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L106 | price % tickSize > 0 || price == 0
(r) 🔗 BookLib.assertLotSizeCompliant | 🎯🟩#L110 | amount % self.settings().lotSizeInBase > 0
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L140 | limitsPlaced >= self.settings().maxLimitsPerTx && ! isMaxLimitExempt(self,factory,account)
(r) 🔗 BookLib.boundToLots | 🎯🟩#L173 | lotSize = self.settings().lotSizeInBase
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L278 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L280 | self.metadata().numBids ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L281 | self.metadata().quoteTokenOpenInterest += self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L283 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L285 | self.metadata().numAsks ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L286 | self.metadata().baseTokenOpenInterest += order.amount
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L295 | limit.headOrder.isNull()
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L299 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._executeAmendNewOrder(Book,Order,ICLOB.AmendArgs).order |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._executeAmendNewOrder | 🎯#L666 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L656 | newOrder.owner = order.owner
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L657 | newOrder.id = order.id
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L663 | quoteTokenDelta = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L663 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L664 | baseTokenDelta = order.amount.toInt256()
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId

(storage) CLOB._executeAmendNewOrder(Book,Order,ICLOB.AmendArgs).ds |
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L289 | self.orders[order.id] = order
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L296 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L297 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L300 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L301 | self.orders[order.id].prevOrderId = tailOrder.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L302 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L508 | (totalQuoteSent,totalBaseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeBid | 🎯🟢#L533 | _removeNonCompetitiveOrder(ds,ds.orders[ds.bidLimits[minBidPrice].tailOrder])
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L549 | (totalQuoteReceived,totalBaseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOB._executeAsk | 🎯🟢#L574 | _removeNonCompetitiveOrder(ds,ds.orders[ds.askLimits[maxAskPrice].tailOrder])
(i) (r*) 🔗 CLOB._executeAmendNewOrder | 🎯#L666 | ds.removeOrderFromBook(order)
(i) (r*) 🔗 CLOB._executeAmendNewOrder | 🎯#L670 | (postAmount,None,None) = _executeBid(ds,newOrder,ICLOB.TiF.MOC,true)
(i) (r*) 🔗 CLOB._executeAmendNewOrder | 🎯#L674 | (postAmount,None,None) = _executeAsk(ds,newOrder,ICLOB.TiF.MOC,true)
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L733 | currMatch = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,bestAskPrice,amountIsBase)
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L763 | currMatch = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,bestBidPrice,amountIsBase)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L159 | limit = _updateBookPostOrder(self,order)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L506 | ds.getBestAskPrice() <= newOrder.price
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L514 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteSent | totalBaseReceived > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L529 | ds.metadata().numBids == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L530 | minBidPrice = ds.getWorstBidPrice()
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L531 | newOrder.price <= minBidPrice
(i) (r) 🔗 CLOB._executeBid | 🎯🟢#L537 | postAmount = ds.getQuoteTokenAmount(newOrder.price,newOrder.amount)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L547 | ds.getBestBidPrice() >= newOrder.price
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L555 | (isTake,newOrder.amount) = _getTakeOrPostAmount(ds,tif,newOrder.amount,totalQuoteReceived | totalBaseSent > 0,baseDenominated,newOrder.price)
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L570 | ds.metadata().numAsks == maxNumOrdersPerSide
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L571 | maxAskPrice = ds.getWorstAskPrice()
(i) (r) 🔗 CLOB._executeAsk | 🎯🟢#L572 | newOrder.price >= maxAskPrice
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L595 | remainingAmount = ds.boundToLots(remainingAmount)
(i) (r) 🔗 CLOB._getTakeOrPostAmount | 🎯🟩#L600 | remainingAmount < ds.settings().minLimitOrderAmountInBase
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L663 | quoteTokenDelta = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L672 | quoteTokenDelta -= postAmount.toInt256()
(i) (r) 🔗 CLOB._executeAmendNewOrder | 🎯#L676 | baseTokenDelta -= postAmount.toInt256()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L720 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L722 | bestAskPrice <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L723 | limit = ds.askLimits[bestAskPrice]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L724 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L726 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L728 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L736 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L738 | totalQuoteSent += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L739 | totalBaseReceived += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L741 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L750 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L752 | bestBidPrice >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L753 | limit = ds.bidLimits[bestBidPrice]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L754 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L756 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L758 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L766 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L768 | totalQuoteReceived += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L769 | totalBaseSent += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L771 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L871 | order.side == Side.BUY
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L872 | quoteRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L873 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().quoteToken),quoteRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L875 | baseRefunded = order.amount
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L876 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().baseToken),baseRefunded)
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L104 | tickSize = self.settings().tickSize
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L106 | price % tickSize > 0 || price == 0
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L140 | limitsPlaced >= self.settings().maxLimitsPerTx && ! isMaxLimitExempt(self,factory,account)
(r) 🔗 BookLib.boundToLots | 🎯🟩#L173 | lotSize = self.settings().lotSizeInBase
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L278 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L279 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L280 | self.metadata().numBids ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L281 | self.metadata().quoteTokenOpenInterest += self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L283 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L284 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L285 | self.metadata().numAsks ++
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L286 | self.metadata().baseTokenOpenInterest += order.amount
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L295 | limit.headOrder.isNull()
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L299 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._executeAmendAmount(Book,Order,uint256,uint32).order |
(i) (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
(i) (w) 🔗 CLOB._executeAmendAmount | 🎯#L701 | order.cancelTimestamp = cancelTimestamp
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L685 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L686 | oldAmountInQuote = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L687 | newAmountInQuote = ds.getQuoteTokenAmount(order.price,amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L689 | quoteTokenDelta = oldAmountInQuote - newAmountInQuote
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L691 | ds.metadata().quoteTokenOpenInterest = uint256(ds.metadata().quoteTokenOpenInterest.toInt256() - quoteTokenDelta)
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L694 | baseTokenDelta = order.amount.toInt256() - amount.toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L696 | ds.metadata().baseTokenOpenInterest = uint256(ds.metadata().baseTokenOpenInterest.toInt256() - baseTokenDelta)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._executeAmendAmount(Book,Order,uint256,uint32).ds |
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L686 | oldAmountInQuote = ds.getQuoteTokenAmount(order.price,order.amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L687 | newAmountInQuote = ds.getQuoteTokenAmount(order.price,amount).toInt256()
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L689 | quoteTokenDelta = oldAmountInQuote - newAmountInQuote
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L691 | ds.metadata().quoteTokenOpenInterest = uint256(ds.metadata().quoteTokenOpenInterest.toInt256() - quoteTokenDelta)
(i) (r) 🔗 CLOB._executeAmendAmount | 🎯#L696 | ds.metadata().baseTokenOpenInterest = uint256(ds.metadata().baseTokenOpenInterest.toInt256() - baseTokenDelta)

(storage) CLOB._matchIncomingBid(Book,Order,bool).ds |
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L727 | _removeExpiredAsk(ds,bestAskOrder)
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L733 | currMatch = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,bestAskPrice,amountIsBase)
(i) (r*) 🔗 CLOB._matchIncomingOrder | 🎯#L807 | _boundMakerToLotSize(ds,makerOrder,lotSize)
(i) (r*) 🔗 CLOB._matchIncomingOrder | 🎯#L839 | ds.removeOrderFromBook(makerOrder)
(i) (r*) 🔗 CLOB._removeExpiredAsk | 🎯#L854 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L720 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L722 | bestAskPrice <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L723 | limit = ds.askLimits[bestAskPrice]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L724 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L726 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L728 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L736 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L738 | totalQuoteSent += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L739 | totalBaseReceived += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L741 | bestAskPrice = ds.getBestAskPrice()
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._matchIncomingBid(Book,Order,bool).limit | ds.askLimits[bestAskPrice]
(i) (w) 🔗 CLOB._matchIncomingBid | 🎯#L723 | limit = ds.askLimits[bestAskPrice]
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L733 | currMatch = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,bestAskPrice,amountIsBase)
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L724 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L726 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L736 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L738 | totalQuoteSent += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L739 | totalBaseReceived += currMatch.baseDelta
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._matchIncomingBid(Book,Order,bool).bestAskOrder | ds.orders[limit.headOrder]
(i) (w) 🔗 CLOB._matchIncomingBid | 🎯#L724 | bestAskOrder = ds.orders[limit.headOrder]
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L727 | _removeExpiredAsk(ds,bestAskOrder)
(i) (r*) 🔗 CLOB._matchIncomingBid | 🎯#L733 | currMatch = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,bestAskPrice,amountIsBase)
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L726 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L736 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L738 | totalQuoteSent += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingBid | 🎯#L739 | totalBaseReceived += currMatch.baseDelta
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._matchIncomingAsk(Book,Order,bool).ds |
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L757 | _removeExpiredBid(ds,bestBidOrder)
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L763 | currMatch = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,bestBidPrice,amountIsBase)
(i) (r*) 🔗 CLOB._matchIncomingOrder | 🎯#L807 | _boundMakerToLotSize(ds,makerOrder,lotSize)
(i) (r*) 🔗 CLOB._matchIncomingOrder | 🎯#L839 | ds.removeOrderFromBook(makerOrder)
(i) (r*) 🔗 CLOB._removeExpiredBid | 🎯#L864 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L750 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L752 | bestBidPrice >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L753 | limit = ds.bidLimits[bestBidPrice]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L754 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L756 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L758 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L766 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L768 | totalQuoteReceived += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L769 | totalBaseSent += currMatch.baseDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L771 | bestBidPrice = ds.getBestBidPrice()
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._matchIncomingAsk(Book,Order,bool).limit | ds.bidLimits[bestBidPrice]
(i) (w) 🔗 CLOB._matchIncomingAsk | 🎯#L753 | limit = ds.bidLimits[bestBidPrice]
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L763 | currMatch = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,bestBidPrice,amountIsBase)
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L754 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L756 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L766 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L768 | totalQuoteReceived += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L769 | totalBaseSent += currMatch.baseDelta
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._matchIncomingAsk(Book,Order,bool).bestBidOrder | ds.orders[limit.headOrder]
(i) (w) 🔗 CLOB._matchIncomingAsk | 🎯#L754 | bestBidOrder = ds.orders[limit.headOrder]
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L757 | _removeExpiredBid(ds,bestBidOrder)
(i) (r*) 🔗 CLOB._matchIncomingAsk | 🎯#L763 | currMatch = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,bestBidPrice,amountIsBase)
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L756 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L766 | incomingOrder.amount -= currMatch.matchedAmount
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L768 | totalQuoteReceived += currMatch.quoteDelta
(i) (r) 🔗 CLOB._matchIncomingAsk | 🎯#L769 | totalBaseSent += currMatch.baseDelta
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._boundMakerToLotSize(Book,Order,uint256).order |
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | _removeExpiredBid(ds,order)
(i) (r*) 🔗 CLOB._boundMakerToLotSize | 🎯#L781 | _removeExpiredAsk(ds,order)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._boundMakerToLotSize(Book,Order,uint256).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | _removeExpiredBid(ds,order)
(i) (r*) 🔗 CLOB._boundMakerToLotSize | 🎯#L781 | _removeExpiredAsk(ds,order)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOB._matchIncomingOrder(Book,Order,Order,uint256,bool).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._matchIncomingOrder | 🎯#L807 | _boundMakerToLotSize(ds,makerOrder,lotSize)
(i) (r*) 🔗 CLOB._matchIncomingOrder | 🎯#L839 | ds.removeOrderFromBook(makerOrder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L805 | lotSize = ds.settings().lotSizeInBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L813 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L819 | matchData.quoteDelta = ds.getQuoteTokenAmount(matchedPrice,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ds.metadata().baseTokenOpenInterest -= matchData.baseDelta
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ds.metadata().quoteTokenOpenInterest -= matchData.quoteDelta
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOB._matchIncomingOrder(Book,Order,Order,uint256,bool).makerOrder |
(i) (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
(i) (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._matchIncomingOrder | 🎯#L807 | _boundMakerToLotSize(ds,makerOrder,lotSize)
(i) (r*) 🔗 CLOB._matchIncomingOrder | 🎯#L839 | ds.removeOrderFromBook(makerOrder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L776 | remainder = order.amount % lotSize
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L777 | remainder == 0
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L779 | remainder == order.amount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L780 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L785 | order.side == Side.BUY
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L786 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L787 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L789 | ds.metadata().quoteTokenOpenInterest -= quoteTokenAmount
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L791 | TransientMakerData.addBaseToken(order.owner,remainder)
(i) (r) 🔗 CLOB._boundMakerToLotSize | 🎯#L792 | ds.metadata().baseTokenOpenInterest -= remainder
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L808 | matchedBase = makerOrder.amount
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L812 | matchData.baseDelta = (matchedBase.min(takerOrder.amount) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L814 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L817 | matchData.baseDelta = (matchedBase.min(ds.getBaseTokenAmount(matchedPrice,takerOrder.amount)) / lotSize) * lotSize
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L820 | matchData.baseDelta != matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L826 | orderRemoved = matchData.baseDelta == matchedBase
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L830 | TransientMakerData.addQuoteToken(makerOrder.owner,matchData.quoteDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L832 | ! orderRemoved
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L834 | TransientMakerData.addBaseToken(makerOrder.owner,matchData.baseDelta)
(i) (r) 🔗 CLOB._matchIncomingOrder | 🎯#L836 | ! orderRemoved
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
    (🔀?makerOrder.amount?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount

(storage) CLOB._removeExpiredAsk(Book,Order).order |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._removeExpiredAsk | 🎯#L854 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L849 | baseTokenAmount = order.amount
(i) (r) 🔗 CLOB._removeExpiredAsk | 🎯#L852 | TransientMakerData.addBaseToken(order.owner,baseTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId

(storage) CLOB._removeExpiredAsk(Book,Order).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._removeExpiredAsk | 🎯#L854 | ds.removeOrderFromBook(order)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOB._removeExpiredBid(Book,Order).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._removeExpiredBid | 🎯#L864 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOB._removeExpiredBid(Book,Order).order |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._removeExpiredBid | 🎯#L864 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L859 | quoteTokenAmount = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeExpiredBid | 🎯#L862 | TransientMakerData.addQuoteToken(order.owner,quoteTokenAmount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId

(storage) CLOB._removeNonCompetitiveOrder(Book,Order).order |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L888 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L871 | order.side == Side.BUY
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L872 | quoteRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L873 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().quoteToken),quoteRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L875 | baseRefunded = order.amount
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L876 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().baseToken),baseRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L879 | OrderCanceled(EventNonceLib.inc(),order.id.unwrap(),order.owner,quoteRefunded,baseRefunded,CancelType.NON_COMPETITIVE)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId

(storage) CLOB._removeNonCompetitiveOrder(Book,Order).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L888 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L872 | quoteRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L873 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().quoteToken),quoteRefunded)
(i) (r) 🔗 CLOB._removeNonCompetitiveOrder | 🎯🟢🌀#L876 | accountManager.creditAccountNoEvent(order.owner,address(ds.config().baseToken),baseRefunded)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOB._executeCancel(Book,address,ICLOB.CancelArgs).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._executeCancel | 🎯#L923 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB._executeCancel | 🎯#L903 | order = ds.orders[orderId.toOrderId()]
(i) (r) 🔗 CLOB._executeCancel | 🎯#L905 | order.isNull()
(i) (r) 🔗 CLOB._executeCancel | 🎯#L908 | order.owner != account
(i) (r) 🔗 CLOB._executeCancel | 🎯#L915 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeCancel | 🎯#L916 | quoteTokenRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._executeCancel | 🎯#L917 | totalQuoteTokenRefunded += quoteTokenRefunded
(i) (r) 🔗 CLOB._executeCancel | 🎯#L919 | baseTokenRefunded = order.amount
(i) (r) 🔗 CLOB._executeCancel | 🎯#L920 | totalBaseTokenRefunded += baseTokenRefunded
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L310 | self.metadata().numBids --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L314 | self.metadata().numAsks --
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | limit = self.askLimits[price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L330 | self.bidTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L333 | self.askTree.remove(price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOB._executeCancel(Book,address,ICLOB.CancelArgs).order | ds.orders[orderId.toOrderId()]
(i) (w) 🔗 CLOB._executeCancel | 🎯#L903 | order = ds.orders[orderId.toOrderId()]
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L319 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L329 | delete self.bidLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L332 | delete self.askLimits[price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L343 | self.orders[prev].nextOrderId = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L344 | limit.headOrder = next
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L346 | self.orders[next].prevOrderId = prev
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L347 | limit.tailOrder = prev
(i) (r*) 🔗 CLOB._executeCancel | 🎯#L923 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOB._executeCancel | 🎯#L905 | order.isNull()
(i) (r) 🔗 CLOB._executeCancel | 🎯#L908 | order.owner != account
(i) (r) 🔗 CLOB._executeCancel | 🎯#L915 | order.side == Side.BUY
(i) (r) 🔗 CLOB._executeCancel | 🎯#L916 | quoteTokenRefunded = ds.getQuoteTokenAmount(order.price,order.amount)
(i) (r) 🔗 CLOB._executeCancel | 🎯#L917 | totalQuoteTokenRefunded += quoteTokenRefunded
(i) (r) 🔗 CLOB._executeCancel | 🎯#L919 | baseTokenRefunded = order.amount
(i) (r) 🔗 CLOB._executeCancel | 🎯#L920 | totalBaseTokenRefunded += baseTokenRefunded
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L309 | order.side == Side.BUY
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L312 | self.metadata().quoteTokenOpenInterest -= self.getQuoteTokenAmount(order.price,order.amount)
(r) 🔗 BookLib._updateBookRemoveOrder | 🎯#L316 | self.metadata().baseTokenOpenInterest -= order.amount
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L325 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L328 | order.side == Side.BUY
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L340 | prev = order.prevOrderId
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L341 | next = order.nextOrderId

(storage) CLOB._settleIncomingOrder(Book,address,Side,uint256,uint256).ds |
(i) (r) 🔗 CLOB._settleIncomingOrder | 🎯🟢🌀#L944 | (settleParams.quoteToken,settleParams.baseToken) = (ds.config().quoteToken,ds.config().baseToken)

(storage) CLOB._settleAmend(Book,address,int256,int256).ds |
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L960 | accountManager.creditAccount(maker,address(ds.config().quoteToken),uint256(quoteTokenDelta))
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L962 | accountManager.debitAccount(maker,address(ds.config().quoteToken),uint256(- quoteTokenDelta))
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L966 | accountManager.creditAccount(maker,address(ds.config().baseToken),uint256(baseTokenDelta))
(i) (r) 🔗 CLOB._settleAmend | 🎯🟢🌀#L968 | accountManager.debitAccount(maker,address(ds.config().baseToken),uint256(- baseTokenDelta))

(storage) Initializable.initializer().$ | _getInitializableStorage()
(storage) Initializable.reinitializer(uint64).$ | _getInitializableStorage()

Solidity Vars Used

msg.sender
msg.sender @ 🔗 ContextUpgradeable._msgSender#24:9 | 🟩 | msg.sender
msg.sender @ 🔗 CLOB.onlyManager#131:13 | 🎯🌈🟢 | msg.sender != address(factory)
msg.sender @ 🔗 ContextUpgradeable._msgSender#24:9 | 🟩 | msg.sender
msg.sender @ 🔗 AccountManager.onlyMarket#87:13 | 🎯🌈 | ! _getAccountStorage().isMarket[msg.sender]
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#22:13 | 🎯🟩🌀 | msg.sender == account || msg.sender == gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#24:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)

msg.data
msg.data @ 🔗 ContextUpgradeable._msgData#28:9 | 🟩 | msg.data
msg.data @ 🔗 ContextUpgradeable._msgData#28:9 | 🟩 | msg.data

block.timestamp
block.timestamp @ 🔗 OrderLib.toOrderChecked#77:13 | 🎯🟩 | uint8(args.tif) <= 1 && args.expiryTime > 0 && args.expiryTime < block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#92:9 | 🎯🟩 | self.expiryTime != NULL_TIMESTAMP && self.expiryTime < block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#97:9 | 🎯🟩 | expiryTime != NULL_TIMESTAMP && expiryTime < block.timestamp

this
this @ 🔗 Initializable.initializer#71:17 | 🌈🟢 | ! extcodesize(uint256)(address()()) < i_initializer_asm_0 >> 1 == 1

External Calls

CLOB.cancel | 🎯💥🟢🌀❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | accountManager.creditAccount(account, baseToken, totalBaseTokenRefunded)
CLOB.cancel | 🎯💥🟢🌀❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | accountManager.creditAccount(account, quoteToken, totalQuoteTokenRefunded)
CLOB._removeNonCompetitiveOrder | 🎯🟢🌀 | accountManager.creditAccountNoEvent(order.owner, address(ds.config().baseToken), baseRefunded)
CLOB._removeNonCompetitiveOrder | 🎯🟢🌀 | accountManager.creditAccountNoEvent(order.owner, address(ds.config().quoteToken), quoteRefunded)
CLOB._settleIncomingOrder | 🎯🟢🌀 | return accountManager.settleIncomingOrder(settleParams)
CLOB._settleAmend | 🎯🟢🌀 | accountManager.debitAccount(maker, address(ds.config().baseToken), uint256(-baseTokenDelta))
CLOB._settleAmend | 🎯🟢🌀 | accountManager.creditAccount(maker, address(ds.config().baseToken), uint256(baseTokenDelta))
CLOB._settleAmend | 🎯🟢🌀 | accountManager.debitAccount(maker, address(ds.config().quoteToken), uint256(-quoteTokenDelta))
CLOB._settleAmend | 🎯🟢🌀 | accountManager.creditAccount(maker, address(ds.config().quoteToken), uint256(quoteTokenDelta))


modifiers_html

functions_html

CLOBManagerStorageLib,/home/ubuntu/2025-08-gte-perps/contracts/clob/CLOBManager.sol#33:1

state_vars_html

(storage) CLOBManagerStorageLib.getCLOBManagerStorage().self |

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 CLOBManager.createMarket#217:9 | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | _emitMarketCreated(msg.sender,marketAddress,quoteDecimals,baseDecimals,config,settings)

modifiers_html

functions_html

CLOBManager,/home/ubuntu/2025-08-gte-perps/contracts/clob/CLOBManager.sol#53:1

state_vars_html

(storage) CLOBManager.createMarket(address,address,SettingsParams).self | _getStorage()
(storage) CLOBManager.setMaxLimitsExempt(address[],bool[]).self | _getStorage()
(i) (w) 🔗 CLOBManager.setMaxLimitsExempt | 🎯💥🟢❌ ['onlyOwnerOrRoles(uint256)']#L263 | self.maxLimitWhitelist[accounts[i]] = toggles[i]

(storage) CLOBManager._getStorage().ds |

Solidity Vars Used

msg.sender
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 CLOBManager.createMarket#217:9 | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | _emitMarketCreated(msg.sender,marketAddress,quoteDecimals,baseDecimals,config,settings)
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 CLOB.onlyManager#131:13 | 🎯🌈🟢 | msg.sender != address(factory)
msg.sender @ 🔗 AccountManager.onlyMarket#87:13 | 🎯🌈 | ! _getAccountStorage().isMarket[msg.sender]
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 AccountManager.onlyCLOBManager#99:13 | 🎯🌈🟢 | msg.sender != clobManager
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)

block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 OrderLib.isExpired#92:9 | 🎯🟩 | self.expiryTime != NULL_TIMESTAMP && self.expiryTime < block.timestamp

this
this @ 🔗 Initializable.initializer#71:17 | 🌈🟢 | ! extcodesize(uint256)(address()()) < i_initializer_asm_0 >> 1 == 1

External Calls

CLOBManager.createMarket | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | accountManager.registerMarket(marketAddress)
CLOBManager.createMarket | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | uint8 baseDecimals = IERC20Metadata(baseToken).decimals()
CLOBManager.createMarket | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | uint8 quoteDecimals = IERC20Metadata(quoteToken).decimals()
CLOBManager.setTickSize | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | market.setTickSize(newTickSize)
CLOBManager.setLotSizeInBase | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | market.setLotSizeInBase(newLotSize)
CLOBManager.setMinLimitOrderAmountInBase | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | market.setMinLimitOrderAmountInBase(newMinLimitOrderAmountInBase)
CLOBManager.adminCancelExpiredOrders | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | market.adminCancelExpiredOrders(ids, side)
CLOBManager.setAccountFeeTiers | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | accountManager.setSpotAccountFeeTiers(accounts, feeTiers)
CLOBManager.setMaxLimitsPerTx | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | market.setMaxLimitsPerTx(newMaxLimits)


modifiers_html

functions_html

BookLib,/home/ubuntu/2025-08-gte-perps/contracts/clob/types/Book.sol#63:1

state_vars_html

(storage) BookLib.assertLimitPriceInBounds(Book,uint256).self |
(storage) BookLib.assertLotSizeCompliant(Book,uint256).self |
(i) (r) 🔗 BookLib.assertLotSizeCompliant | 🎯🟩#L110 | amount % self.settings().lotSizeInBase > 0

(storage) BookLib.assertMakeAmountInBounds(Book,uint256).self |
(i) (r) 🔗 BookLib.assertMakeAmountInBounds | 🎯🟩#L115 | orderAmountInBase < self.settings().minLimitOrderAmountInBase
(i) (r) 🔗 BookLib.assertMakeAmountInBounds | 🎯🟩#L116 | orderAmountInBase % self.settings().lotSizeInBase != 0

(storage) BookLib.assertUnusedOrderId(Book,uint256).self |
(storage) BookLib.incrementLimitsPlaced(Book,address,address).self |
(i) (r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L140 | limitsPlaced >= self.settings().maxLimitsPerTx && ! isMaxLimitExempt(self,factory,account)

(storage) BookLib.incrementOrderId(Book).self |
(storage) BookLib.addOrderToBook(Book,Order).self |
(storage) BookLib.addOrderToBook(Book,Order).limit | _updateBookPostOrder(self,order)
(storage) BookLib.removeOrderFromBook(Book,Order).order |
(storage) BookLib.removeOrderFromBook(Book,Order).self |
(storage) BookLib.boundToLots(Book,uint256).self |
(storage) BookLib.getNextOrders(Book,OrderId,uint256).self |
(storage) BookLib.getNextOrders(Book,OrderId,uint256).currentOrder | self.orders[startOrderId]
(storage) BookLib.getNextOrders(Book,OrderId,uint256).nextLimit | self.getLimit(price,currentOrder.side)
(storage) BookLib.getOrdersPaginated(Book,Order,uint256).ds |
(i) (r) 🔗 BookLib.getOrdersPaginated | 🎯🟩#L238 | nextOrder = ds.orders[ds.bidLimits[ds.getNextSmallestPrice(nextOrder.price,Side.BUY)].headOrder]
(i) (r) 🔗 BookLib.getOrdersPaginated | 🎯🟩#L242 | nextOrder = ds.orders[nextOrder.nextOrderId]
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.getBaseQuanta(Book).self |
(i) (r) 🔗 BookLib.getBaseQuanta | 🎯🟩#L256 | marketSettings = self.settings()
(i) (r) 🔗 BookLib.getBaseQuanta | 🎯🟩#L258 | marketSettings.lotSizeInBase.fullMulDiv(marketSettings.tickSize,self.config().baseSize)

(storage) BookLib.getBaseQuanta(Book).marketSettings | self.settings()
(i) (w) 🔗 BookLib.getBaseQuanta | 🎯🟩#L256 | marketSettings = self.settings()
(i) (r) 🔗 BookLib.getBaseQuanta | 🎯🟩#L258 | marketSettings.lotSizeInBase.fullMulDiv(marketSettings.tickSize,self.config().baseSize)

(storage) BookLib._updateBookPostOrder(Book,Order).self |
(storage) BookLib._updateBookPostOrder(Book,Order).limit |
(storage) BookLib._updateLimitPostOrder(Book,Limit,Order).limit |
(storage) BookLib._updateLimitPostOrder(Book,Limit,Order).self |
(storage) BookLib._updateLimitPostOrder(Book,Limit,Order).tailOrder | self.orders[limit.tailOrder]
(storage) BookLib._updateBookRemoveOrder(Book,Order).order |
(storage) BookLib._updateBookRemoveOrder(Book,Order).self |
(storage) BookLib._updateLimitRemoveOrder(Book,Order).order |
(storage) BookLib._updateLimitRemoveOrder(Book,Order).limit | if order.side == Side.BUY then self.bidLimits[price] else self.askLimits[price]
(storage) BookLib._updateLimitRemoveOrder(Book,Order).self |

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)

External Calls

BookLib.isMaxLimitExempt | 🎯🟢🌀 | allowed = ICLOBManager(factory).getMaxLimitExempt(who)


modifiers_html

functions_html

CLOBStorageLib,/home/ubuntu/2025-08-gte-perps/contracts/clob/types/Book.sol#352:1

state_vars_html

(storage) CLOBStorageLib._getCLOBStorage().self |
(storage) CLOBStorageLib._getMarketConfigStorage().self |
(storage) CLOBStorageLib._getMarketSettingsStorage().self |
(storage) CLOBStorageLib._getMarketMetadataStorage().self |
(storage) CLOBStorageLib.getBestBidPrice(Book).self |
(i) (r) 🔗 CLOBStorageLib.getBestBidPrice | 🎯🟩#L449 | self.bidTree.maximum()
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOBStorageLib.getBestAskPrice(Book).self |
(i) (r) 🔗 CLOBStorageLib.getBestAskPrice | 🎯🟩#L454 | self.askTree.minimum()
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOBStorageLib.getWorstBidPrice(Book).self |
(i) (r) 🔗 CLOBStorageLib.getWorstBidPrice | 🎯🟩#L459 | self.bidTree.minimum()
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOBStorageLib.getWorstAskPrice(Book).self |
(i) (r) 🔗 CLOBStorageLib.getWorstAskPrice | 🎯🟩#L464 | self.askTree.maximum()
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOBStorageLib.getLimit(Book,uint256,Side).self |
(i) (r) 🔗 CLOBStorageLib.getLimit | 🎯🟩#L469 | self.bidLimits[price]

(storage) CLOBStorageLib.getNextBiggestPrice(Book,uint256,Side).self |
(i) (r) 🔗 CLOBStorageLib.getNextBiggestPrice | 🎯🟩#L474 | self.bidTree.getNextBiggest(price)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOBStorageLib.getNextSmallestPrice(Book,uint256,Side).self |
(i) (r) 🔗 CLOBStorageLib.getNextSmallestPrice | 🎯🟩#L479 | self.bidTree.getNextSmallest(price)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOBStorageLib.getBaseTokenAmount(Book,uint256,uint256).self |
(i) (r) 🔗 CLOBStorageLib.getBaseTokenAmount | 🎯🟩#L488 | quoteAmount * self.config().baseSize / price

(storage) CLOBStorageLib.getQuoteTokenAmount(Book,uint256,uint256).self |
(i) (r) 🔗 CLOBStorageLib.getQuoteTokenAmount | 🎯🟩#L497 | baseAmount * price / self.config().baseSize

(storage) CLOBStorageLib.setMaxLimitsPerTx(Book,uint8).self |
(i) (r) 🔗 CLOBStorageLib.setMaxLimitsPerTx | 🎯#L503 | self.settings().maxLimitsPerTx = newMaxLimits

(storage) CLOBStorageLib.setTickSize(Book,uint256).self |
(r) 🔗 BookLib.getBaseQuanta | 🎯🟩#L256 | marketSettings = self.settings()
(i) (r) 🔗 CLOBStorageLib.setTickSize | 🎯#L509 | self.settings().tickSize = newTickSize
(i) (r) 🔗 CLOBStorageLib.setTickSize | 🎯#L511 | self.getBaseQuanta() == 0

(storage) CLOBStorageLib.setMinLimitOrderAmountInBase(Book,uint256).self |
(i) (r) 🔗 CLOBStorageLib.setMinLimitOrderAmountInBase | 🎯#L517 | newMinLimitOrderAmountInBase < self.settings().lotSizeInBase
(i) (r) 🔗 CLOBStorageLib.setMinLimitOrderAmountInBase | 🎯#L519 | self.settings().minLimitOrderAmountInBase = newMinLimitOrderAmountInBase

(storage) CLOBStorageLib.setLotSizeInBase(Book,uint256).self |
(r) 🔗 BookLib.getBaseQuanta | 🎯🟩#L256 | marketSettings = self.settings()
(i) (r) 🔗 CLOBStorageLib.setLotSizeInBase | 🎯#L525 | self.settings().lotSizeInBase = newLotSizeInBase
(i) (r) 🔗 CLOBStorageLib.setLotSizeInBase | 🎯#L527 | self.settings().minLimitOrderAmountInBase < newLotSizeInBase
(i) (r) 🔗 CLOBStorageLib.setLotSizeInBase | 🎯#L528 | self.getBaseQuanta() == 0

(storage) CLOBStorageLib.init(Book,MarketConfig,MarketSettings).self |
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L538 | cs.quoteToken = marketConfig.quoteToken
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L539 | cs.baseToken = marketConfig.baseToken
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L540 | cs.quoteSize = marketConfig.quoteSize
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L541 | cs.baseSize = marketConfig.baseSize
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L543 | ss.status = marketSettings.status
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L544 | ss.maxLimitsPerTx = marketSettings.maxLimitsPerTx
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L545 | ss.minLimitOrderAmountInBase = marketSettings.minLimitOrderAmountInBase
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L546 | ss.tickSize = marketSettings.tickSize
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L547 | ss.lotSizeInBase = marketSettings.lotSizeInBase
(i) (r) 🔗 CLOBStorageLib.init | 🎯#L535 | cs = self.config()
(i) (r) 🔗 CLOBStorageLib.init | 🎯#L536 | ss = self.settings()
    (🔀?ss.status?)  (w) 🔗 MarketLib.init | 🎯#L115 | settings.status = initSettings.status
    (🔀?ss.status?)  (w) 🔗 MarketLib.init | 🎯#L115 | settings.status = initSettings.status
    (🔀?ss.maxLimitsPerTx?)  (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L687 | bookSettings.maxLimitsPerTx = settings.maxLimitsPerTx
    (🔀?ss.maxLimitsPerTx?)  (w) 🔗 CLOBLib.init | 🎯#L116 | dsSettings.maxLimitsPerTx = bookSettings.maxLimitsPerTx
    (🔀?ss.minLimitOrderAmountInBase?)  (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L688 | bookSettings.minLimitOrderAmountInBase = settings.minLimitOrderAmountInBase
    (🔀?ss.minLimitOrderAmountInBase?)  (w) 🔗 CLOBLib.init | 🎯#L117 | dsSettings.minLimitOrderAmountInBase = bookSettings.minLimitOrderAmountInBase
    (🔀?ss.tickSize?)  (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L689 | bookSettings.tickSize = settings.tickSize
    (🔀?ss.tickSize?)  (w) 🔗 CLOBLib.init | 🎯#L118 | dsSettings.tickSize = bookSettings.tickSize

(storage) CLOBStorageLib.init(Book,MarketConfig,MarketSettings).cs | self.config()
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L535 | cs = self.config()
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L538 | cs.quoteToken = marketConfig.quoteToken
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L539 | cs.baseToken = marketConfig.baseToken
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L540 | cs.quoteSize = marketConfig.quoteSize
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L541 | cs.baseSize = marketConfig.baseSize

(storage) CLOBStorageLib.init(Book,MarketConfig,MarketSettings).ss | self.settings()
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L536 | ss = self.settings()
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L543 | ss.status = marketSettings.status
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L544 | ss.maxLimitsPerTx = marketSettings.maxLimitsPerTx
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L545 | ss.minLimitOrderAmountInBase = marketSettings.minLimitOrderAmountInBase
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L546 | ss.tickSize = marketSettings.tickSize
(i) (w) 🔗 CLOBStorageLib.init | 🎯#L547 | ss.lotSizeInBase = marketSettings.lotSizeInBase
    (🔀?ss.status?)  (w) 🔗 MarketLib.init | 🎯#L115 | settings.status = initSettings.status
    (🔀?ss.status?)  (w) 🔗 MarketLib.init | 🎯#L115 | settings.status = initSettings.status
    (🔀?ss.maxLimitsPerTx?)  (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L687 | bookSettings.maxLimitsPerTx = settings.maxLimitsPerTx
    (🔀?ss.maxLimitsPerTx?)  (w) 🔗 CLOBLib.init | 🎯#L116 | dsSettings.maxLimitsPerTx = bookSettings.maxLimitsPerTx
    (🔀?ss.minLimitOrderAmountInBase?)  (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L688 | bookSettings.minLimitOrderAmountInBase = settings.minLimitOrderAmountInBase
    (🔀?ss.minLimitOrderAmountInBase?)  (w) 🔗 CLOBLib.init | 🎯#L117 | dsSettings.minLimitOrderAmountInBase = bookSettings.minLimitOrderAmountInBase
    (🔀?ss.tickSize?)  (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L689 | bookSettings.tickSize = settings.tickSize
    (🔀?ss.tickSize?)  (w) 🔗 CLOBLib.init | 🎯#L118 | dsSettings.tickSize = bookSettings.tickSize

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)

modifiers_html

functions_html

PackedFeeRatesLib,/home/ubuntu/2025-08-gte-perps/contracts/clob/types/FeeData.sol#13:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)

modifiers_html

functions_html

FeeDataStorageLib,/home/ubuntu/2025-08-gte-perps/contracts/clob/types/FeeData.sol#60:1

state_vars_html

(storage) FeeDataStorageLib.getFeeDataStorage().self |

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)

modifiers_html

functions_html

FeeDataLib,/home/ubuntu/2025-08-gte-perps/contracts/clob/types/FeeData.sol#76:1

state_vars_html

(storage) FeeDataLib.getTakerFee(FeeData,PackedFeeRates,address,uint256).self |
(i) (r) 🔗 FeeDataLib.getTakerFee | 🎯🟢🟩#L98 | feeRate = takerRates.getFeeAt(uint256(self.accountFeeTier[account]))

(storage) FeeDataLib.getMakerFee(FeeData,PackedFeeRates,address,uint256).self |
(i) (r) 🔗 FeeDataLib.getMakerFee | 🎯🟢🟩#L110 | feeRate = makerRates.getFeeAt(uint256(self.accountFeeTier[account]))

(storage) FeeDataLib.getAccountFeeTier(FeeData,address).self |
(i) (r) 🔗 FeeDataLib.getAccountFeeTier | 🎯🟩#L116 | self.accountFeeTier[account]

(storage) FeeDataLib.setAccountFeeTier(FeeData,address,FeeTiers).self |
(i) (w) 🔗 FeeDataLib.setAccountFeeTier | 🎯#L121 | self.accountFeeTier[account] = feeTier
    (🔀?self.accountFeeTier[account]?)  (w) 🔗 FeeManagerLib.setAccountFeeTier | 🎯#L24 | self.accountFeeTier[account] = feeTier

(storage) FeeDataLib.accrueFee(FeeData,address,uint256).self |
(i) (w) 🔗 FeeDataLib.accrueFee | 🎯#L128 | self.totalFees[token] += amount
(i) (w) 🔗 FeeDataLib.accrueFee | 🎯#L129 | self.unclaimedFees[token] += amount

(storage) FeeDataLib.claimFees(FeeData,address).self |
(i) (w) 🔗 FeeDataLib.claimFees | 🎯#L137 | delete self.unclaimedFees[token]
(i) (r) 🔗 FeeDataLib.claimFees | 🎯#L136 | fees = self.unclaimedFees[token]

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)

modifiers_html

functions_html

OrderIdLib,/home/ubuntu/2025-08-gte-perps/contracts/clob/types/Order.sol#10:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)

block.timestamp
block.timestamp @ 🔗 OrderLib.toOrderChecked#77:13 | 🎯🟩 | uint8(args.tif) <= 1 && args.expiryTime > 0 && args.expiryTime < block.timestamp

modifiers_html

functions_html

OrderLib,/home/ubuntu/2025-08-gte-perps/contracts/clob/types/Order.sol#53:1

state_vars_html

(storage) OrderLib.isNull(Order).self |
(storage) OrderLib.assertExists(Order).self |

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)

block.timestamp
block.timestamp @ 🔗 OrderLib.toOrderChecked#77:13 | 🎯🟩 | uint8(args.tif) <= 1 && args.expiryTime > 0 && args.expiryTime < block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#92:9 | 🎯🟩 | self.expiryTime != NULL_TIMESTAMP && self.expiryTime < block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#97:9 | 🎯🟩 | expiryTime != NULL_TIMESTAMP && expiryTime < block.timestamp

modifiers_html

functions_html

BookRedBlackTreeLib,/home/ubuntu/2025-08-gte-perps/contracts/clob/types/RedBlackTree.sol#15:1

state_vars_html

(storage) BookRedBlackTreeLib.size(RedBlackTree).tree |
(i) (r) 🔗 BookRedBlackTreeLib.size | 🎯🟩#L20 | RedBlackTreeLib.size(tree.tree)
(r) 🔗 RedBlackTreeLib.size | 🟢🟩#L100 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib.size | 🟢🟩#L103 | result = sload(uint256)(nodes) & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) BookRedBlackTreeLib.minimum(RedBlackTree).tree |
(i) (r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(i) (r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) BookRedBlackTreeLib.maximum(RedBlackTree).tree |
(i) (r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(i) (r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) BookRedBlackTreeLib.contains(RedBlackTree,uint256).tree |
(i) (r) 🔗 BookRedBlackTreeLib.contains | 🎯🟩#L42 | RedBlackTreeLib.exists(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.exists | 🟩#L183 | (None,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.exists | 🟩#L184 | result = key != 0
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookRedBlackTreeLib.getNextBiggest(RedBlackTree,uint256).tree |
(i) (r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(i) (r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(i) (r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(i) (r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookRedBlackTreeLib.getNextSmallest(RedBlackTree,uint256).tree |
(i) (r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(i) (r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(i) (r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(i) (r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookRedBlackTreeLib.insert(RedBlackTree,uint256).tree |
(i) (r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookRedBlackTreeLib.remove(RedBlackTree,uint256).tree |
(i) (r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

modifiers_html

functions_html

Roles,/home/ubuntu/2025-08-gte-perps/contracts/clob/types/Roles.sol#9:1

state_vars_html

modifiers_html

functions_html

TransientMakerData,/home/ubuntu/2025-08-gte-perps/contracts/clob/types/TransientMakerData.sol#13:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)

modifiers_html

functions_html

SimpleBondingCurve,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/BondingCurves/SimpleBondingCurve.sol#8:1

state_vars_html

(storage) SimpleBondingCurve.buy(address,uint256).r | reserves[token]
(i) (r) 🔗 SimpleBondingCurve.buy | 🎯💥🟢🔴❌ ['onlyLaunchpad']#L101 | quoteAmount = _getQuoteAmount(baseAmount,r.quoteReserve,r.baseReserve,true)

(storage) SimpleBondingCurve.sell(address,uint256).r | reserves[token]
(i) (r) 🔗 SimpleBondingCurve.sell | 🎯💥🟢🔴❌ ['onlyLaunchpad']#L110 | quoteAmount = _getQuoteAmount(baseAmount,r.quoteReserve,r.baseReserve,false)

(storage) SimpleBondingCurve.getReserves(address).r | reserves[token]
(i) (r) 🔗 SimpleBondingCurve.getReserves | 🎯💥🟢🟩#L138 | quoteReserve = r.quoteReserve
(i) (r) 🔗 SimpleBondingCurve.getReserves | 🎯💥🟢🟩#L139 | baseReserve = r.baseReserve

(storage) SimpleBondingCurve.quoteBaseForQuote(address,uint256,bool).r | reserves[token]
(i) (r) 🔗 SimpleBondingCurve.quoteBaseForQuote | 🎯💥🟢🟩#L148 | baseAmount = _getBaseAmount(quoteAmount,r.quoteReserve,r.baseReserve,isBuy)

(storage) SimpleBondingCurve.quoteQuoteForBase(address,uint256,bool).r | reserves[token]
(i) (r) 🔗 SimpleBondingCurve.quoteQuoteForBase | 🎯💥🟢🟩#L157 | quoteAmount = _getQuoteAmount(baseAmount,r.quoteReserve,r.baseReserve,isBuy)

(storage) SimpleBondingCurve._setReserves(address,uint256,uint256).r | reserves[token]
(i) (w) 🔗 SimpleBondingCurve._setReserves | 🎯🟢🔴#L170 | r.quoteReserve = quoteReserve
(i) (w) 🔗 SimpleBondingCurve._setReserves | 🎯🟢🔴#L171 | r.baseReserve = baseReserve

(storage) SimpleBondingCurve._setSupply(address,uint256,uint256).s | supply[token]
(i) (w) 🔗 SimpleBondingCurve._setSupply | 🎯🟢🔴#L178 | s.totalSupply = totalSupply_
(i) (w) 🔗 SimpleBondingCurve._setSupply | 🎯🟢🔴#L179 | s.bondingSupply = bondingSupply_

SimpleBondingCurve.VIRTUAL_BASE |
(i) (w) 🔗 SimpleBondingCurve._setVirtualReserves | 🎯🔴#L186 | VIRTUAL_BASE = virtualBase
(i) (r) 🔗 SimpleBondingCurve.baseSoldFromCurve | 🎯💥🟢🟩#L129 | (supply[token].bondingSupply + VIRTUAL_BASE) - reserves[token].baseReserve
(i) (r) 🔗 SimpleBondingCurve.initializeCurve | 🎯💥🟢❌ ['onlyLaunchpad']#L71 | _setReserves(token,VIRTUAL_QUOTE,bondingSupply_ + VIRTUAL_BASE)
(i) (r) 🔗 SimpleBondingCurve.initializeCurve | 🎯💥🟢❌ ['onlyLaunchpad']#L74 | NewTokenLaunched(token,VIRTUAL_BASE,VIRTUAL_QUOTE)

SimpleBondingCurve.VIRTUAL_QUOTE |
(i) (w) 🔗 SimpleBondingCurve._setVirtualReserves | 🎯🔴#L187 | VIRTUAL_QUOTE = virtualQuote
(i) (r) 🔗 SimpleBondingCurve.quoteBoughtByCurve | 🎯💥🟢🟩#L133 | reserves[token].quoteReserve - VIRTUAL_QUOTE
(i) (r) 🔗 SimpleBondingCurve.initializeCurve | 🎯💥🟢❌ ['onlyLaunchpad']#L71 | _setReserves(token,VIRTUAL_QUOTE,bondingSupply_ + VIRTUAL_BASE)
(i) (r) 🔗 SimpleBondingCurve.initializeCurve | 🎯💥🟢❌ ['onlyLaunchpad']#L74 | NewTokenLaunched(token,VIRTUAL_BASE,VIRTUAL_QUOTE)

SimpleBondingCurve.reserves |
(i) (w) 🔗 SimpleBondingCurve._setReserves | 🎯🟢🔴#L170 | r.quoteReserve = quoteReserve
(i) (w) 🔗 SimpleBondingCurve._setReserves | 🎯🟢🔴#L171 | r.baseReserve = baseReserve
(i) (r) 🔗 SimpleBondingCurve.buy | 🎯💥🟢🔴❌ ['onlyLaunchpad']#L101 | quoteAmount = _getQuoteAmount(baseAmount,r.quoteReserve,r.baseReserve,true)
(i) (r) 🔗 SimpleBondingCurve.sell | 🎯💥🟢🔴❌ ['onlyLaunchpad']#L110 | quoteAmount = _getQuoteAmount(baseAmount,r.quoteReserve,r.baseReserve,false)
(i) (r) 🔗 SimpleBondingCurve.baseSoldFromCurve | 🎯💥🟢🟩#L129 | (supply[token].bondingSupply + VIRTUAL_BASE) - reserves[token].baseReserve
(i) (r) 🔗 SimpleBondingCurve.quoteBoughtByCurve | 🎯💥🟢🟩#L133 | reserves[token].quoteReserve - VIRTUAL_QUOTE
(i) (r) 🔗 SimpleBondingCurve.getReserves | 🎯💥🟢🟩#L136 | (quoteReserve,baseReserve)
(i) (r) 🔗 SimpleBondingCurve.getReserves | 🎯💥🟢🟩#L138 | quoteReserve = r.quoteReserve
(i) (r) 🔗 SimpleBondingCurve.getReserves | 🎯💥🟢🟩#L139 | baseReserve = r.baseReserve
(i) (r) 🔗 SimpleBondingCurve.quoteBaseForQuote | 🎯💥🟢🟩#L148 | baseAmount = _getBaseAmount(quoteAmount,r.quoteReserve,r.baseReserve,isBuy)
(i) (r) 🔗 SimpleBondingCurve.quoteQuoteForBase | 🎯💥🟢🟩#L157 | quoteAmount = _getQuoteAmount(baseAmount,r.quoteReserve,r.baseReserve,isBuy)

SimpleBondingCurve.supply |
(i) (w) 🔗 SimpleBondingCurve._setSupply | 🎯🟢🔴#L178 | s.totalSupply = totalSupply_
(i) (w) 🔗 SimpleBondingCurve._setSupply | 🎯🟢🔴#L179 | s.bondingSupply = bondingSupply_
(i) (r) 🔗 SimpleBondingCurve.bondingSupply | 🎯💥🟢🟩#L121 | supply[token].bondingSupply
(i) (r) 🔗 SimpleBondingCurve.totalSupply | 🎯💥🟢🟩#L125 | supply[token].totalSupply
(i) (r) 🔗 SimpleBondingCurve.baseSoldFromCurve | 🎯💥🟢🟩#L129 | (supply[token].bondingSupply + VIRTUAL_BASE) - reserves[token].baseReserve

Solidity Vars Used

msg.sender
msg.sender @ 🔗 SimpleBondingCurve.onlyLaunchpadOwner#54:13 | 🎯🌈🟢🌀 | msg.sender != Ownable(launchpad).owner()
msg.sender @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
msg.sender @ 🔗 GTERouter.launchpadSell#188:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.sell({account:msg.sender,token:launchToken,recipient:msg.sender,amountInBase:amountInBase,minAmountOutQuote:worstAmountOutQuote})
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 SimpleBondingCurve.onlyLaunchpad#49:13 | 🎯🌈🟢 | msg.sender != launchpad

this
this @ 🔗 Launchpad.initialize#185:9 | 🎯💥🟢🔴🌀 ['initializer'] | LaunchToken(quoteAsset_).approve(address(this),0)
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 Launchpad.sell#359:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amountInBase)

msg.value
msg.value @ 🔗 Launchpad.launch#244:13 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | msg.value != launchFee

block.timestamp
block.timestamp @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})

modifiers_html

functions_html

Distributor,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/Distributor.sol#13:1

state_vars_html

(storage) Distributor.getPendingRewards(address,address).rs | RewardsTrackerStorage.getRewardPool(launchAsset)
(i) (w) 🔗 Distributor.getPendingRewards | 🎯💥🟩#L82 | rs = RewardsTrackerStorage.getRewardPool(launchAsset)
(i) (r) 🔗 Distributor.getPendingRewards | 🎯💥🟩#L84 | rs.getPendingRewards(account)
(r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L174 | (accBaseRewardsPerShare,accQuoteRewardsPerShare) = getAccRewardsPerShare(self)
(r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L176 | userData = self.userRewards[user]
(r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L177 | shares = uint256(userData.shares)
(r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L182 | baseAmount = totalAccRewards(shares,accBaseRewardsPerShare) - uint128(userData.baseRewardDebt)
(r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L183 | quoteAmount = totalAccRewards(shares,accQuoteRewardsPerShare) - uint128(userData.quoteRewardDebt)
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L217 | accBaseRewardsPerShare = self.accBaseRewardPerShare
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L218 | accQuoteRewardsPerShare = self.accQuoteRewardPerShare
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L221 | accBaseRewardsPerShare += ((self.pendingBaseRewards * PRECISION_FACTOR) / uint128(totalShares))
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L225 | accQuoteRewardsPerShare += ((self.pendingQuoteRewards * PRECISION_FACTOR) / uint128(totalShares))

(storage) Distributor.createRewardsPair(address,address).rs | RewardsTrackerStorage.getRewardPool(launchAsset)
(i) (w) 🔗 Distributor.createRewardsPair | 🎯💥❌ ['onlyLaunchpad']#L94 | rs = RewardsTrackerStorage.getRewardPool(launchAsset)
(w) 🔗 RewardsTrackerLib.initializePair | 🎯#L77 | self.quoteAsset = quoteAsset
(i) (r*) 🔗 Distributor.createRewardsPair | 🎯💥❌ ['onlyLaunchpad']#L100 | rs.initializePair(launchAsset,quoteAsset)
(i) (r) 🔗 Distributor.createRewardsPair | 🎯💥❌ ['onlyLaunchpad']#L98 | rs.quoteAsset != address(0) || rsq.quoteAsset != address(0)

(storage) Distributor.createRewardsPair(address,address).rsq | RewardsTrackerStorage.getRewardPool(quoteAsset)
(i) (w) 🔗 Distributor.createRewardsPair | 🎯💥❌ ['onlyLaunchpad']#L95 | rsq = RewardsTrackerStorage.getRewardPool(quoteAsset)
(i) (r) 🔗 Distributor.createRewardsPair | 🎯💥❌ ['onlyLaunchpad']#L98 | rs.quoteAsset != address(0) || rsq.quoteAsset != address(0)

(storage) Distributor.addRewards(address,address,uint128,uint128).rs | RewardsTrackerStorage.getRewardPool(token0)
(i) (w) 🔗 Distributor.addRewards | 🎯💥#L109 | rs = RewardsTrackerStorage.getRewardPool(token0)
(i) (w) 🔗 Distributor.addRewards | 🎯💥#L112 | rs = RewardsTrackerStorage.getRewardPool(token1)
(w) 🔗 RewardsTrackerLib.addBaseRewards | 🎯#L82 | self.pendingBaseRewards += amount
(w) 🔗 RewardsTrackerLib.addQuoteRewards | 🎯#L89 | self.pendingQuoteRewards += amount
(i) (r*) 🔗 Distributor.addRewards | 🎯💥#L122 | rs.addBaseRewards(launchAsset,launchAssetAmount)
(i) (r*) 🔗 Distributor.addRewards | 🎯💥#L128 | rs.addQuoteRewards(launchAsset,quoteAsset,quoteAssetAmount)
(i) (r) 🔗 Distributor.addRewards | 🎯💥#L111 | rs.quoteAsset == address(0)
(i) (r) 🔗 Distributor.addRewards | 🎯💥#L114 | rs.quoteAsset == address(0)
(i) (r) 🔗 Distributor.addRewards | 🎯💥#L119 | rs.totalShares == 0

(storage) Distributor.increaseStake(address,address,uint96).rs | RewardsTrackerStorage.getRewardPool(launchAsset)
(i) (w) 🔗 Distributor.increaseStake | 🎯💥❌ ['onlyLaunchpad']#L140 | rs = RewardsTrackerStorage.getRewardPool(launchAsset)
(w) 🔗 RewardsTrackerLib.stake | 🎯#L112 | userData.shares += newShares
(w) 🔗 RewardsTrackerLib.stake | 🎯#L113 | self.totalShares += newShares
(w) 🔗 RewardsTrackerLib.stake | 🎯#L116 | userData.baseRewardDebt = uint96(totalAccRewards(existingShares + newShares,accBaseRewardsPerShare))
(w) 🔗 RewardsTrackerLib.stake | 🎯#L117 | userData.quoteRewardDebt = uint96(totalAccRewards(existingShares + newShares,accQuoteRewardsPerShare))
(w) 🔗 RewardsTrackerLib.update | 🎯#L198 | self.accBaseRewardPerShare = newAccBaseRewardsPerShare
(w) 🔗 RewardsTrackerLib.update | 🎯#L203 | self.accQuoteRewardPerShare = newAccQuoteRewardsPerShare
(i) (r*) 🔗 Distributor.increaseStake | 🎯💥❌ ['onlyLaunchpad']#L142 | (baseAmount,quoteAmount) = rs.stake(account,uint96(shares))
(r*) 🔗 RewardsTrackerLib.stake | 🎯#L99 | (accBaseRewardsPerShare,accQuoteRewardsPerShare) = self.update()
(i) (r) 🔗 Distributor.increaseStake | 🎯💥❌ ['onlyLaunchpad']#L143 | _distributeAssets(launchAsset,baseAmount,rs.quoteAsset,quoteAmount)
(r) 🔗 RewardsTrackerLib.stake | 🎯#L101 | userData = self.userRewards[user]
(r) 🔗 RewardsTrackerLib.stake | 🎯#L103 | existingShares = uint96(userData.shares)
(r) 🔗 RewardsTrackerLib.stake | 🎯#L106 | existingShares > 0
(r) 🔗 RewardsTrackerLib.stake | 🎯#L107 | baseAmount = totalAccRewards(existingShares,accBaseRewardsPerShare) - userData.baseRewardDebt
(r) 🔗 RewardsTrackerLib.stake | 🎯#L108 | quoteAmount = totalAccRewards(existingShares,accQuoteRewardsPerShare) - userData.quoteRewardDebt
(r) 🔗 RewardsTrackerLib.update | 🎯#L195 | (newAccBaseRewardsPerShare,newAccQuoteRewardsPerShare) = getAccRewardsPerShare(self)
(r) 🔗 RewardsTrackerLib.update | 🎯#L197 | self.pendingBaseRewards > 0
(r) 🔗 RewardsTrackerLib.update | 🎯#L199 | delete self.pendingBaseRewards
(r) 🔗 RewardsTrackerLib.update | 🎯#L202 | self.pendingQuoteRewards > 0
(r) 🔗 RewardsTrackerLib.update | 🎯#L204 | delete self.pendingQuoteRewards
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L217 | accBaseRewardsPerShare = self.accBaseRewardPerShare
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L218 | accQuoteRewardsPerShare = self.accQuoteRewardPerShare
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L221 | accBaseRewardsPerShare += ((self.pendingBaseRewards * PRECISION_FACTOR) / uint128(totalShares))
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L225 | accQuoteRewardsPerShare += ((self.pendingQuoteRewards * PRECISION_FACTOR) / uint128(totalShares))

(storage) Distributor.decreaseStake(address,address,uint96).rs | RewardsTrackerStorage.getRewardPool(launchAsset)
(i) (w) 🔗 Distributor.decreaseStake | 🎯💥❌ ['onlyLaunchpad']#L152 | rs = RewardsTrackerStorage.getRewardPool(launchAsset)
(w) 🔗 RewardsTrackerLib.unstake | 🎯#L138 | userData.shares -= removeShares
(w) 🔗 RewardsTrackerLib.unstake | 🎯#L139 | self.totalShares -= removeShares
(w) 🔗 RewardsTrackerLib.unstake | 🎯#L142 | userData.baseRewardDebt = uint96(totalAccRewards(existingShares - removeShares,accBaseRewardsPerShare))
(w) 🔗 RewardsTrackerLib.unstake | 🎯#L143 | userData.quoteRewardDebt = uint96(totalAccRewards(existingShares - removeShares,accQuoteRewardsPerShare))
(w) 🔗 RewardsTrackerLib.update | 🎯#L198 | self.accBaseRewardPerShare = newAccBaseRewardsPerShare
(w) 🔗 RewardsTrackerLib.update | 🎯#L203 | self.accQuoteRewardPerShare = newAccQuoteRewardsPerShare
(i) (r*) 🔗 Distributor.decreaseStake | 🎯💥❌ ['onlyLaunchpad']#L154 | (baseAmount,quoteAmount) = rs.unstake(account,uint96(shares))
(r*) 🔗 RewardsTrackerLib.unstake | 🎯#L124 | (accBaseRewardsPerShare,accQuoteRewardsPerShare) = self.update()
(i) (r) 🔗 Distributor.decreaseStake | 🎯💥❌ ['onlyLaunchpad']#L155 | _distributeAssets(launchAsset,baseAmount,rs.quoteAsset,quoteAmount)
(r) 🔗 RewardsTrackerLib.unstake | 🎯#L126 | userData = self.userRewards[user]
(r) 🔗 RewardsTrackerLib.unstake | 🎯#L130 | existingShares = uint256(userData.shares)
(r) 🔗 RewardsTrackerLib.unstake | 🎯#L131 | existingShares < removeShares
(r) 🔗 RewardsTrackerLib.unstake | 🎯#L134 | baseAmount = totalAccRewards(existingShares,accBaseRewardsPerShare) - userData.baseRewardDebt
(r) 🔗 RewardsTrackerLib.unstake | 🎯#L135 | quoteAmount = totalAccRewards(existingShares,accQuoteRewardsPerShare) - userData.quoteRewardDebt
(r) 🔗 RewardsTrackerLib.update | 🎯#L195 | (newAccBaseRewardsPerShare,newAccQuoteRewardsPerShare) = getAccRewardsPerShare(self)
(r) 🔗 RewardsTrackerLib.update | 🎯#L197 | self.pendingBaseRewards > 0
(r) 🔗 RewardsTrackerLib.update | 🎯#L199 | delete self.pendingBaseRewards
(r) 🔗 RewardsTrackerLib.update | 🎯#L202 | self.pendingQuoteRewards > 0
(r) 🔗 RewardsTrackerLib.update | 🎯#L204 | delete self.pendingQuoteRewards
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L217 | accBaseRewardsPerShare = self.accBaseRewardPerShare
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L218 | accQuoteRewardsPerShare = self.accQuoteRewardPerShare
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L221 | accBaseRewardsPerShare += ((self.pendingBaseRewards * PRECISION_FACTOR) / uint128(totalShares))
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L225 | accQuoteRewardsPerShare += ((self.pendingQuoteRewards * PRECISION_FACTOR) / uint128(totalShares))

(storage) Distributor.claimRewards(address).rs | RewardsTrackerStorage.getRewardPool(launchAsset)
(i) (w) 🔗 Distributor.claimRewards | 🎯💥#L160 | rs = RewardsTrackerStorage.getRewardPool(launchAsset)
(w) 🔗 RewardsTrackerLib.claim | 🎯#L165 | userData.baseRewardDebt = uint96(totalAccBaseRewards)
(w) 🔗 RewardsTrackerLib.claim | 🎯#L166 | userData.quoteRewardDebt = uint96(totalAccQuoteRewards)
(w) 🔗 RewardsTrackerLib.update | 🎯#L198 | self.accBaseRewardPerShare = newAccBaseRewardsPerShare
(w) 🔗 RewardsTrackerLib.update | 🎯#L203 | self.accQuoteRewardPerShare = newAccQuoteRewardsPerShare
(i) (r*) 🔗 Distributor.claimRewards | 🎯💥#L162 | (baseAmount,quoteAmount) = rs.claim(msg.sender)
(r*) 🔗 RewardsTrackerLib.claim | 🎯#L155 | (accBaseRewardsPerShare,accQuoteRewardsPerShare) = self.update()
(i) (r) 🔗 Distributor.claimRewards | 🎯💥#L164 | _distributeAssets(launchAsset,baseAmount,rs.quoteAsset,quoteAmount)
(r) 🔗 RewardsTrackerLib.claim | 🎯#L150 | userData = self.userRewards[user]
(r) 🔗 RewardsTrackerLib.claim | 🎯#L151 | shares = uint256(userData.shares)
(r) 🔗 RewardsTrackerLib.claim | 🎯#L158 | totalAccBaseRewards = totalAccRewards(shares,accBaseRewardsPerShare)
(r) 🔗 RewardsTrackerLib.claim | 🎯#L159 | totalAccQuoteRewards = totalAccRewards(shares,accQuoteRewardsPerShare)
(r) 🔗 RewardsTrackerLib.claim | 🎯#L161 | baseAmount = totalAccBaseRewards - uint128(userData.baseRewardDebt)
(r) 🔗 RewardsTrackerLib.claim | 🎯#L162 | quoteAmount = totalAccQuoteRewards - uint128(userData.quoteRewardDebt)
(r) 🔗 RewardsTrackerLib.update | 🎯#L195 | (newAccBaseRewardsPerShare,newAccQuoteRewardsPerShare) = getAccRewardsPerShare(self)
(r) 🔗 RewardsTrackerLib.update | 🎯#L197 | self.pendingBaseRewards > 0
(r) 🔗 RewardsTrackerLib.update | 🎯#L199 | delete self.pendingBaseRewards
(r) 🔗 RewardsTrackerLib.update | 🎯#L202 | self.pendingQuoteRewards > 0
(r) 🔗 RewardsTrackerLib.update | 🎯#L204 | delete self.pendingQuoteRewards
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L217 | accBaseRewardsPerShare = self.accBaseRewardPerShare
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L218 | accQuoteRewardsPerShare = self.accQuoteRewardPerShare
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L221 | accBaseRewardsPerShare += ((self.pendingBaseRewards * PRECISION_FACTOR) / uint128(totalShares))
(r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L225 | accQuoteRewardsPerShare += ((self.pendingQuoteRewards * PRECISION_FACTOR) / uint128(totalShares))

Distributor.initialized |
Distributor.launchpad |
(i) (r) 🔗 Distributor.onlyLaunchpad | 🎯🌈🟢#L46 | msg.sender != launchpad

Distributor.totalPendingRewards |
(i) (w) 🔗 Distributor._increaseTotalPending | 🎯🟢🔴#L181 | totalPendingRewards[asset] += amount
(i) (w) 🔗 Distributor._decreaseTotalPending | 🎯🟢🔴#L193 | totalPendingRewards[asset] -= amount
(i) (r) 🔗 Distributor._decreaseTotalPending | 🎯🟢🔴#L188 | currTotal = totalPendingRewards[asset]
(i) (r) 🔗 Distributor.skimExcessRewards | 🎯💥🟢❌ ['onlyOwnerOrRoles(uint256)']#L51 | amount > asset.balanceOf(address(this)) - totalPendingRewards[asset]

Solidity Vars Used

msg.sender
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 Distributor.claimRewards#162:9 | 🎯💥 | (baseAmount,quoteAmount) = rs.claim(msg.sender)
msg.sender @ 🔗 Distributor._distributeAssets#170:13 | 🎯 | base.safeTransfer(msg.sender,baseAmount)
msg.sender @ 🔗 Distributor._distributeAssets#175:13 | 🎯 | quote.safeTransfer(msg.sender,quoteAmount)
msg.sender @ 🔗 Launchpad.increaseStake#423:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.increaseStake(msg.sender,account,shares)
msg.sender @ 🔗 Launchpad.decreaseStake#427:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.decreaseStake(msg.sender,account,shares)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor
msg.sender @ 🔗 Distributor.onlyLaunchpad#46:13 | 🎯🌈🟢 | msg.sender != launchpad
msg.sender @ 🔗 Distributor.constructor#35:9 | 🎯💥 | _initializeOwner(msg.sender)
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 Distributor.skimExcessRewards#53:9 | 🎯💥🟢❌ ['onlyOwnerOrRoles(uint256)'] | asset.safeTransfer(msg.sender,amount)
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
msg.sender @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))

block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 GTELaunchpadV2Pair._update#132:9 | 🎯🟢🔴 | blockTimestamp = uint32(block.timestamp % 2 ** 32)
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

this
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 Distributor.skimExcessRewards#51:13 | 🎯💥🟢❌ ['onlyOwnerOrRoles(uint256)'] | amount > asset.balanceOf(address(this)) - totalPendingRewards[asset]
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.sync#316:9 | 🎯💥🟢🌀 ['lock'] | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
this @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))

msg.value
msg.value @ 🔗 Launchpad.launch#244:13 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | msg.value != launchFee

External Calls

Distributor.endRewards | 🎯💥🌀❌ ['onlyLaunchpad'] | pair.endRewardsAccrual()


modifiers_html

functions_html

LaunchToken,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/LaunchToken.sol#8:1

state_vars_html

LaunchToken._name |
LaunchToken._symbol |
(i) (w) 🔗 LaunchToken.constructor | 🎯💥🔴#L51 | _symbol = symbol_

LaunchToken._mediaURI |
(i) (w) 🔗 LaunchToken.constructor | 🎯💥🔴#L52 | _mediaURI = mediaUri_

LaunchToken.unlocked |
(i) (r) 🔗 LaunchToken._beforeTokenTransfer | 🎯🟢#L107 | ! unlocked && from != launchpad && to != launchpad && to != gteRouter
(i) (r) 🔗 LaunchToken._decreaseFeeShares | 🎯🟢🔴🌀#L147 | totalFeeShare == 0 && ! unlocked

LaunchToken.eventNonce |
LaunchToken.totalFeeShare |
(i) (r) 🔗 LaunchToken._decreaseFeeShares | 🎯🟢🔴🌀#L147 | totalFeeShare == 0 && ! unlocked

LaunchToken.bondingShare |
(i) (w) 🔗 LaunchToken._increaseFeeShares | 🎯🟢🔴🌀#L128 | bondingShare[account] += amount
(i) (w) 🔗 LaunchToken._decreaseFeeShares | 🎯🟢🔴🌀#L144 | bondingShare[account] -= amount
(i) (r) 🔗 LaunchToken._decreaseFeeShares | 🎯🟢🔴🌀#L135 | share = bondingShare[account]
(i) (r) 🔗 LaunchToken._decreaseFeeShares | 🎯🟢🔴🌀#L136 | share == 0 || account == address(0)
(i) (r) 🔗 LaunchToken._decreaseFeeShares | 🎯🟢🔴🌀#L147 | totalFeeShare == 0 && ! unlocked
(i) (r) 🔗 LaunchToken._decreaseFeeShares | 🎯🟢🔴🌀#L149 | ILaunchpad(launchpad).decreaseStake(account,uint96(amount))

Solidity Vars Used

msg.sender
msg.sender @ 🔗 Distributor._distributeAssets#170:13 | 🎯 | base.safeTransfer(msg.sender,baseAmount)
msg.sender @ 🔗 Distributor._distributeAssets#175:13 | 🎯 | quote.safeTransfer(msg.sender,quoteAmount)
msg.sender @ 🔗 Launchpad.increaseStake#423:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.increaseStake(msg.sender,account,shares)
msg.sender @ 🔗 Launchpad.decreaseStake#427:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.decreaseStake(msg.sender,account,shares)
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 Launchpad.onlyLaunchAsset#134:13 | 🎯🌈🟢 | _launches[msg.sender].quote == address(0)
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor
msg.sender @ 🔗 LaunchToken.onlyLaunchpad#62:13 | 🎯🌈🟢 | msg.sender != launchpad
msg.sender @ 🔗 Distributor.onlyLaunchpad#46:13 | 🎯🌈🟢 | msg.sender != launchpad
msg.sender @ 🔗 LaunchToken.constructor#54:9 | 🎯💥🔴 | launchpad = msg.sender
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
msg.sender @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
msg.sender @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))

this
this @ 🔗 ERC20.permit#433:13 | 💥🟢 | mstore(uint256,uint256)(m_permit_asm_1 + 0x80,address()())
this @ 🔗 ERC20.DOMAIN_SEPARATOR#484:13 | 💱💥🟢🟩 | mstore(uint256,uint256)(m_DOMAIN_SEPARATOR_asm_0 + 0x80,address()())
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.skim#310:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))
this @ 🔗 GTELaunchpadV2Pair.skim#311:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 ERC20.permit#433:13 | 💥🟢 | mstore(uint256,uint256)(m_permit_asm_1 + 0x80,address()())
this @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
this @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))
this @ 🔗 ERC20.DOMAIN_SEPARATOR#484:13 | 💱💥🟢🟩 | mstore(uint256,uint256)(m_DOMAIN_SEPARATOR_asm_0 + 0x80,address()())

block.timestamp
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})
block.timestamp @ 🔗 GTELaunchpadV2Pair._update#132:9 | 🎯🟢🔴 | blockTimestamp = uint32(block.timestamp % 2 ** 32)
block.timestamp @ 🔗 LaunchToken.unlock#92:9 | 🎯💥🔴❌ ['onlyLaunchpad'] | TransfersUnlocked(block.timestamp,_incEventNonce())
block.timestamp @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

msg.value
msg.value @ 🔗 Launchpad.launch#244:13 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | msg.value != launchFee

External Calls

LaunchToken._increaseFeeShares | 🎯🟢🔴🌀 | ILaunchpad(launchpad).increaseStake(account, uint96(amount))
LaunchToken._decreaseFeeShares | 🎯🟢🔴🌀 | ILaunchpad(launchpad).decreaseStake(account, uint96(amount))
LaunchToken._endRewards | 🎯🟢🌀 | ILaunchpad(launchpad).endRewards()


modifiers_html

functions_html

Launchpad,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/Launchpad.sol#28:1

state_vars_html

Launchpad.launchpadLPVault |
(i) (w) 🔗 Launchpad.initialize | 🎯💥🟢🔴🌀 ['initializer']#L189 | launchpadLPVault = LaunchpadLPVault(launchpadLPVault_)
(i) (w) 🔗 Launchpad.updateLaunchpadLPVault | 🎯💥🔴❌ ['onlyOwner']#L415 | launchpadLPVault = LaunchpadLPVault(newLaunchpadLPVault)
(i) (r) 🔗 Launchpad._createPairAndSwapRemaining | 🎯🟢🌀#L500 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})

Launchpad.currentQuoteAsset |
(i) (w) 🔗 Launchpad.initialize | 🎯💥🟢🔴🌀 ['initializer']#L188 | currentQuoteAsset = LaunchToken(quoteAsset_)
(i) (w) 🔗 Launchpad.updateQuoteAsset | 🎯💥🟢🔴🌀❌ ['onlyOwner']#L392 | currentQuoteAsset = LaunchToken(newQuoteAsset)
(i) (r) 🔗 Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant']#L246 | quote = address(currentQuoteAsset)
(i) (r) 🔗 Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant']#L255 | distributor.createRewardsPair(token,quote)
(i) (r) 🔗 Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant']#L257 | _launches[token] = LaunchData({active:true,curve:curve,quote:quote})
(i) (r) 🔗 Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant']#L259 | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
(i) (r) 🔗 Launchpad.updateQuoteAsset | 🎯💥🟢🔴🌀❌ ['onlyOwner']#L388 | QuoteAssetUpdated(address(currentQuoteAsset),newQuoteAsset,LaunchToken(newQuoteAsset).decimals(),EventNonceLib.inc())

Launchpad.currentBondingCurve |
(i) (w) 🔗 Launchpad.initialize | 🎯💥🟢🔴🌀 ['initializer']#L187 | currentBondingCurve = IBondingCurveMinimal(bondingCurve_)
(i) (w) 🔗 Launchpad.updateBondingCurve | 🎯💥🟢🔴❌ ['onlyOwner']#L377 | currentBondingCurve = IBondingCurveMinimal(newBondingCurve)
(i) (r) 🔗 Launchpad.initialize | 🎯💥🟢🔴🌀 ['initializer']#L192 | currentBondingCurve.init(bondingCurveInitData)
(i) (r) 🔗 Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant']#L254 | curve.initializeCurve(token,TOTAL_SUPPLY,BONDING_SUPPLY)
(i) (r) 🔗 Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant']#L257 | _launches[token] = LaunchData({active:true,curve:curve,quote:quote})
(i) (r) 🔗 Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant']#L259 | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
(i) (r) 🔗 Launchpad.updateBondingCurve | 🎯💥🟢🔴❌ ['onlyOwner']#L375 | BondingCurveUpdated(address(currentBondingCurve),newBondingCurve,EventNonceLib.inc())

Launchpad._launches |
(i) (w) 🔗 Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant']#L257 | _launches[token] = LaunchData({active:true,curve:curve,quote:quote})
(i) (w) 🔗 Launchpad.buy | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)']#L282 | (amountOutBaseActual,data.active) = _checkGraduation(buyData.token,data,buyData.amountOutBase)
(i) (w) 🔗 Launchpad._graduate | 🎯🟢🔴🌀#L315 | _launches[buyData.token].active = false
(i) (r) 🔗 Launchpad.onlyLaunchAsset | 🎯🌈🟢#L134 | _launches[msg.sender].quote == address(0)
(i) (r) 🔗 Launchpad.onlyBondingActive | 🎯🌈🟢#L139 | ! _launches[token].active
(i) (r) 🔗 Launchpad.launches | 🎯💥🟢🟩#L202 | _launches[launchToken]
(i) (r) 🔗 Launchpad.baseSoldFromCurve | 🎯💥🟢🟩🌀#L206 | _launches[token].curve.baseSoldFromCurve(token)
(i) (r) 🔗 Launchpad.quoteBoughtByCurve | 🎯💥🟢🟩🌀#L210 | _launches[token].curve.quoteBoughtByCurve(token)
(i) (r) 🔗 Launchpad.quoteBaseForQuote | 🎯💥🟢🟩🌀#L218 | _launches[token].curve.quoteBaseForQuote(token,quoteAmount,isBuy)
(i) (r) 🔗 Launchpad.quoteQuoteForBase | 🎯💥🟢🟩🌀#L226 | _launches[token].curve.quoteQuoteForBase(token,baseAmount,isBuy)
(i) (r) 🔗 Launchpad.buy | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)']#L290 | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
(i) (r) 🔗 Launchpad.buy | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)']#L292 | _emitSwapEvent({account:buyData.account,token:buyData.token,baseAmount:amountOutBaseActual,quoteAmount:amountInQuote,isBuy:true,curve:data.curve})
(i) (r) 🔗 Launchpad.buy | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)']#L303 | (amountOutBaseActual,amountInQuote) = _graduate(buyData,pair,data,amountOutBaseActual,amountInQuote)
(i) (r) 🔗 Launchpad.sell | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)']#L350 | _emitSwapEvent({account:account,token:token,baseAmount:amountInBase,quoteAmount:amountOutQuote,isBuy:false,curve:data.curve})
(i) (r) 🔗 Launchpad.updateQuoteAsset | 🎯💥🟢🔴🌀❌ ['onlyOwner']#L383 | newQuoteAsset == address(0) || _launches[newQuoteAsset].quote != address(0)
(i) (r) 🔗 Launchpad.endRewards | 🎯💥🟢🌀❌ ['onlyLaunchAsset']#L434 | quote = _launches[msg.sender].quote
(i) (r) 🔗 Launchpad.endRewards | 🎯💥🟢🌀❌ ['onlyLaunchAsset']#L436 | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
(i) (r) 🔗 Launchpad._assertValidRecipient | 🎯🟢🟩#L564 | pair = pairFor(address(uniV2Factory),baseToken,_launches[baseToken].quote)
(i) (r) 🔗 Launchpad._assertValidRecipient | 🎯🟢🟩#L565 | address(pair) == recipient
    (🔀?_launches[buyData.token].active?)  (w) 🔗 AdminPanel.activateProtocol | 🎯💥❌ ['onlyAdmin']#L324 | clearingHouse.active = true
    (🔀?_launches[buyData.token].active?)  (w) 🔗 AdminPanel.deactivateProtocol | 🎯💥❌ ['onlyAdmin']#L334 | clearingHouse.active = false

Launchpad.launchFee |
Launchpad.uniV2InitCodeHash |
(i) (r) 🔗 Launchpad.pairFor | 🎯🟢🟩#L571 | pair = IUniswapV2Pair(address(uint160(uint256(keccak256(bytes)(abi.encodePacked(0xff,factory,keccak256(bytes)(abi.encodePacked(token0,token1)),uniV2InitCodeHash))))))

Solidity Vars Used

this
this @ 🔗 Launchpad.updateQuoteAsset#386:9 | 🎯💥🟢🔴🌀❌ ['onlyOwner'] | LaunchToken(newQuoteAsset).approve(address(this),0)
this @ 🔗 Launchpad.pullFees#403:9 | 🎯💥🌀❌❗ ['onlyOwner'] | (success,None) = address(msg.sender).call{value: address(this).balance}()
this @ 🔗 Launchpad._swapRemaining#538:9 | 🎯🟢🌀 | data.quote.safeTransferFrom(msg.sender,address(this),data.quoteAmount)
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 Launchpad.initialize#185:9 | 🎯💥🟢🔴🌀 ['initializer'] | LaunchToken(quoteAsset_).approve(address(this),0)
this @ 🔗 GTELaunchpadV2Pair.skim#310:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))
this @ 🔗 GTELaunchpadV2Pair.skim#311:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))
this @ 🔗 ReentrancyGuard.nonReentrant#31:13 | 🌈🟢🔴 | sload(uint256)(_REENTRANCY_GUARD_SLOT) == address()()
this @ 🔗 ReentrancyGuard.nonReentrant#35:13 | 🌈🟢🔴 | sstore(uint256,uint256)(_REENTRANCY_GUARD_SLOT,address()())
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 ReentrancyGuard.nonReadReentrant#48:13 | 🌈🟢 | sload(uint256)(_REENTRANCY_GUARD_SLOT) == address()()
this @ 🔗 Launchpad.sell#359:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amountInBase)
this @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
this @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))
this @ 🔗 Initializable.initializer#71:17 | 🌈🟢 | ! extcodesize(uint256)(address()()) < i_initializer_asm_0 >> 1 == 1

msg.sender
msg.sender @ 🔗 Launchpad.pullFees#403:9 | 🎯💥🌀❌❗ ['onlyOwner'] | (success,None) = address(msg.sender).call{value: address(this).balance}()
msg.sender @ 🔗 Distributor._distributeAssets#170:13 | 🎯 | base.safeTransfer(msg.sender,baseAmount)
msg.sender @ 🔗 Distributor._distributeAssets#175:13 | 🎯 | quote.safeTransfer(msg.sender,quoteAmount)
msg.sender @ 🔗 Launchpad.increaseStake#423:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.increaseStake(msg.sender,account,shares)
msg.sender @ 🔗 Launchpad.decreaseStake#427:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.decreaseStake(msg.sender,account,shares)
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 Launchpad.onlyLaunchAsset#134:13 | 🎯🌈🟢 | _launches[msg.sender].quote == address(0)
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 Launchpad._swapRemaining#538:9 | 🎯🟢🌀 | data.quote.safeTransferFrom(msg.sender,address(this),data.quoteAmount)
msg.sender @ 🔗 Launchpad._swapRemaining#556:13 | 🎯🟢🌀 | data.quote.safeTransfer(msg.sender,data.quoteAmount)
msg.sender @ 🔗 Launchpad.onlySenderOrOperator#144:13 | 🎯🌈🟢 | msg.sender != gteRouter
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 SimpleBondingCurve.onlyLaunchpad#49:13 | 🎯🌈🟢 | msg.sender != launchpad
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 LaunchToken.onlyLaunchpad#62:13 | 🎯🌈🟢 | msg.sender != launchpad
msg.sender @ 🔗 Distributor.onlyLaunchpad#46:13 | 🎯🌈🟢 | msg.sender != launchpad
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 GTERouter.launchpadSell#188:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.sell({account:msg.sender,token:launchToken,recipient:msg.sender,amountInBase:amountInBase,minAmountOutQuote:worstAmountOutQuote})
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#33:13 | 🎯🟩🌀 | msg.sender == account
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#35:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
msg.sender @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
msg.sender @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))

block.timestamp
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})
block.timestamp @ 🔗 Launchpad._swapRemaining#548:9 | 🎯🟢🌀 | uniV2Router.swapTokensForExactTokens(data.baseAmount,data.quoteAmount,path,data.recipient,block.timestamp + 1)
block.timestamp @ 🔗 GTELaunchpadV2Pair._update#132:9 | 🎯🟢🔴 | blockTimestamp = uint32(block.timestamp % 2 ** 32)
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 LaunchToken.unlock#92:9 | 🎯💥🔴❌ ['onlyLaunchpad'] | TransfersUnlocked(block.timestamp,_incEventNonce())
block.timestamp @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

msg.value
msg.value @ 🔗 Launchpad.launch#244:13 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | msg.value != launchFee

External Calls

Launchpad.constructor | 🎯💥🟢🔴🌀 | uniV2Factory = IUniswapV2FactoryMinimal(uniV2Router.factory())
Launchpad.initialize | 🎯💥🟢🔴🌀 ['initializer'] | LaunchToken(quoteAsset_).approve(address(this), 0)
Launchpad.initialize | 🎯💥🟢🔴🌀 ['initializer'] | currentBondingCurve.init(bondingCurveInitData)
Launchpad.baseSoldFromCurve | 🎯💥🟢🟩🌀 | return _launches[token].curve.baseSoldFromCurve(token)
Launchpad.quoteBoughtByCurve | 🎯💥🟢🟩🌀 | return _launches[token].curve.quoteBoughtByCurve(token)
Launchpad.quoteBaseForQuote | 🎯💥🟢🟩🌀 | return _launches[token].curve.quoteBaseForQuote(token, quoteAmount, isBuy)
Launchpad.quoteQuoteForBase | 🎯💥🟢🟩🌀 | return _launches[token].curve.quoteQuoteForBase(token, baseAmount, isBuy)
Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | LaunchToken(token).mint(TOTAL_SUPPLY)
Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | distributor.createRewardsPair(token, quote)
Launchpad.launch | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | curve.initializeCurve(token, TOTAL_SUPPLY, BONDING_SUPPLY)
Launchpad.buy | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | amountInQuote = data.curve.buy(buyData.token, amountOutBaseActual)
Launchpad._graduate | 🎯🟢🔴🌀 | LaunchToken(buyData.token).unlock()
Launchpad.sell | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | uint256 currentBaseSold = data.curve.baseSoldFromCurve(token)
Launchpad.sell | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | uint256 amountOutQuote = data.curve.sell(token, amountInBase)
Launchpad.updateQuoteAsset | 🎯💥🟢🔴🌀❌ ['onlyOwner'] | emit QuoteAssetUpdated( address(currentQuoteAsset), newQuoteAsset, LaunchToken(newQuoteAsset).decimals(), LaunchpadEventNonce.inc() )
Launchpad.updateQuoteAsset | 🎯💥🟢🔴🌀❌ ['onlyOwner'] | LaunchToken(newQuoteAsset).approve(address(this), 0)
Launchpad.pullFees | 🎯💥🌀❌❗ ['onlyOwner'] | (bool success,) = payable(msg.sender).call{value: address(this).balance}("")
Launchpad.increaseStake | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.increaseStake(msg.sender, account, shares)
Launchpad.decreaseStake | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.decreaseStake(msg.sender, account, shares)
Launchpad.endRewards | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.endRewards(pair)
Launchpad._checkGraduation | 🎯🟩🌀 | uint256 maxBaseForSale = data.curve.bondingSupply(token)
Launchpad._checkGraduation | 🎯🟩🌀 | uint256 baseSold = data.curve.baseSoldFromCurve(token)
Launchpad._createPairAndSwapRemaining | 🎯🟢🌀 | uint256 tokensToLock = data.curve.totalSupply(token) - data.curve.bondingSupply(token)
Launchpad._createPairAndSwapRemaining | 🎯🟢🌀 | uint256 tokensToLock = data.curve.totalSupply(token) - data.curve.bondingSupply(token)
Launchpad._createPairAndSwapRemaining | 🎯🟢🌀 | pair.skim(owner())
Launchpad._createPairAndSwapRemaining | 🎯🟢🌀 | uint256 quoteToLock = data.curve.quoteBoughtByCurve(token)
Launchpad._createPairAndSwapRemaining | 🎯🟢🌀 | uniV2Router.addLiquidity({ tokenA: token, tokenB: address(data.quote), amountADesired: tokensToLock, amountBDesired: quoteToLock, amountAMin: 0, amountBMin: 0, to: address(launchpadLPVault), deadline: block.timestamp })
Launchpad._createPairAndSwapRemaining | 🎯🟢🌀 | uint256 quoteNeeded = uniV2Router.getAmountIn({amountOut: remainingBase, reserveIn: quoteToLock, reserveOut: tokensToLock})
Launchpad._createPairAndSwapRemaining | 🎯🟢🌀 | try uniV2Factory.createPair(token, data.quote) returns (address p) { pair = IUniswapV2Pair(p); } catch { // Do nothing, pair exists // @todo its more gas but lets check pair exists and create if it doest. // try catch in solidity is horrible and should be avoided }
Launchpad._swapRemaining | 🎯🟢🌀 | try uniV2Router.swapTokensForExactTokens( data.baseAmount, data.quoteAmount, path, data.recipient, block.timestamp + 1 ) { // Return the tokens received and quote used return (data.baseAmount, data.quoteAmount); } catch { // If swap fails, return the additional quote tokens to the user and remove approval data.quote.safeApprove(address(uniV2Router), 0); data.quote.safeTransfer(msg.sender, data.quoteAmount); return (0, 0); }
Launchpad._emitSwapEvent | 🎯🌀 | emit Swap({ buyer: account, token: token, baseDelta: baseDelta, quoteDelta: quoteDelta, nextAmountSold: curve.baseSoldFromCurve(token), // Current state after trade newPrice: curve.quoteBoughtByCurve(token), eventNonce: LaunchpadEventNonce.inc() })
Launchpad._emitSwapEvent | 🎯🌀 | emit Swap({ buyer: account, token: token, baseDelta: baseDelta, quoteDelta: quoteDelta, nextAmountSold: curve.baseSoldFromCurve(token), // Current state after trade newPrice: curve.quoteBoughtByCurve(token), eventNonce: LaunchpadEventNonce.inc() })


modifiers_html

functions_html

LaunchpadLPVault,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/LaunchpadLPVault.sol#6:1

state_vars_html

(storage) Ownable2StepUpgradeable._getOwnable2StepStorage().$ |
(storage) Ownable2StepUpgradeable.pendingOwner().$ | _getOwnable2StepStorage()
(w) 🔗 Ownable2StepUpgradeable.pendingOwner | 💥🟩#L52 | $ = _getOwnable2StepStorage()

(storage) Ownable2StepUpgradeable.transferOwnership(address).$ | _getOwnable2StepStorage()
(storage) Ownable2StepUpgradeable._transferOwnership(address).$ | _getOwnable2StepStorage()
(w) 🔗 Ownable2StepUpgradeable._transferOwnership | #L73 | $ = _getOwnable2StepStorage()

(storage) OwnableUpgradeable._getOwnableStorage().$ |
(storage) OwnableUpgradeable.owner().$ | _getOwnableStorage()
(w) 🔗 OwnableUpgradeable.owner | 💥🟩#L74 | $ = _getOwnableStorage()

(storage) OwnableUpgradeable._transferOwnership(address).$ | _getOwnableStorage()
(w) 🔗 OwnableUpgradeable._transferOwnership | #L114 | $ = _getOwnableStorage()

(storage) Initializable._disableInitializers().$ | _getInitializableStorage()
(storage) Initializable._getInitializableStorage().$ |
(storage) Initializable.initializer().$ | _getInitializableStorage()
(storage) Initializable.reinitializer(uint64).$ | _getInitializableStorage()
LaunchpadLPVault.launchpad |

Solidity Vars Used

msg.data
msg.data @ 🔗 ContextUpgradeable._msgData#28:9 | 🟩 | msg.data
msg.data @ 🔗 ContextUpgradeable._msgData#28:9 | 🟩 | msg.data

msg.sender
msg.sender @ 🔗 ContextUpgradeable._msgSender#24:9 | 🟩 | msg.sender
msg.sender @ 🔗 ContextUpgradeable._msgSender#24:9 | 🟩 | msg.sender

this
this @ 🔗 Initializable.initializer#71:17 | 🌈🟢 | ! extcodesize(uint256)(address()()) < i_initializer_asm_0 >> 1 == 1

modifiers_html

functions_html

IUniswapV2FactoryMinimal,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/interfaces/IUniswapV2FactoryMinimal.sol#3:1

state_vars_html


Solidity Vars Used

block.timestamp
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})

this
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)

msg.sender
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))

modifiers_html

functions_html

IUniswapV2RouterMinimal,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/interfaces/IUniswapV2RouterMinimal.sol#4:1

state_vars_html


Solidity Vars Used

this
this @ 🔗 Launchpad._swapRemaining#538:9 | 🎯🟢🌀 | data.quote.safeTransferFrom(msg.sender,address(this),data.quoteAmount)
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)

msg.sender
msg.sender @ 🔗 Launchpad._swapRemaining#538:9 | 🎯🟢🌀 | data.quote.safeTransferFrom(msg.sender,address(this),data.quoteAmount)
msg.sender @ 🔗 Launchpad._swapRemaining#556:13 | 🎯🟢🌀 | data.quote.safeTransfer(msg.sender,data.quoteAmount)
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))

block.timestamp
block.timestamp @ 🔗 Launchpad._swapRemaining#548:9 | 🎯🟢🌀 | uniV2Router.swapTokensForExactTokens(data.baseAmount,data.quoteAmount,path,data.recipient,block.timestamp + 1)
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})

modifiers_html

functions_html

RewardsTrackerLib,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/libraries/RewardsTracker.sol#39:1

state_vars_html

(storage) RewardsTrackerLib.getQuoteAsset(RewardPoolData).self |
(storage) RewardsTrackerLib.getUserData(RewardPoolData,address).self |
(i) (r) 🔗 RewardsTrackerLib.getUserData | 🎯🟩#L62 | self.userRewards[account]

(storage) RewardsTrackerLib.getRewardsPoolData(RewardPoolData).self |
(i) (r) 🔗 RewardsTrackerLib.getRewardsPoolData | 🎯🟩#L66 | pm = RewardPoolDataMemory({quoteAsset:self.quoteAsset,totalShares:self.totalShares,pendingBaseRewards:self.pendingBaseRewards,pendingQuoteRewards:self.pendingQuoteRewards,accBaseRewardPerShare:self.accBaseRewardPerShare,accQuoteRewardPerShare:self.accQuoteRewardPerShare})

(storage) RewardsTrackerLib.initializePair(RewardPoolData,address,address).self |
(i) (w) 🔗 RewardsTrackerLib.initializePair | 🎯#L77 | self.quoteAsset = quoteAsset

(storage) RewardsTrackerLib.addBaseRewards(RewardPoolData,address,uint128).self |
(i) (w) 🔗 RewardsTrackerLib.addBaseRewards | 🎯#L82 | self.pendingBaseRewards += amount

(storage) RewardsTrackerLib.addQuoteRewards(RewardPoolData,address,address,uint128).self |
(i) (w) 🔗 RewardsTrackerLib.addQuoteRewards | 🎯#L89 | self.pendingQuoteRewards += amount

(storage) RewardsTrackerLib.stake(RewardPoolData,address,uint96).self |
(i) (w) 🔗 RewardsTrackerLib.stake | 🎯#L112 | userData.shares += newShares
(i) (w) 🔗 RewardsTrackerLib.stake | 🎯#L113 | self.totalShares += newShares
(i) (w) 🔗 RewardsTrackerLib.stake | 🎯#L116 | userData.baseRewardDebt = uint96(totalAccRewards(existingShares + newShares,accBaseRewardsPerShare))
(i) (w) 🔗 RewardsTrackerLib.stake | 🎯#L117 | userData.quoteRewardDebt = uint96(totalAccRewards(existingShares + newShares,accQuoteRewardsPerShare))
(i) (w) 🔗 RewardsTrackerLib.update | 🎯#L198 | self.accBaseRewardPerShare = newAccBaseRewardsPerShare
(i) (w) 🔗 RewardsTrackerLib.update | 🎯#L203 | self.accQuoteRewardPerShare = newAccQuoteRewardsPerShare
(i) (r*) 🔗 RewardsTrackerLib.stake | 🎯#L99 | (accBaseRewardsPerShare,accQuoteRewardsPerShare) = self.update()
(i) (r) 🔗 RewardsTrackerLib.stake | 🎯#L101 | userData = self.userRewards[user]
(i) (r) 🔗 RewardsTrackerLib.stake | 🎯#L103 | existingShares = uint96(userData.shares)
(i) (r) 🔗 RewardsTrackerLib.stake | 🎯#L106 | existingShares > 0
(i) (r) 🔗 RewardsTrackerLib.stake | 🎯#L107 | baseAmount = totalAccRewards(existingShares,accBaseRewardsPerShare) - userData.baseRewardDebt
(i) (r) 🔗 RewardsTrackerLib.stake | 🎯#L108 | quoteAmount = totalAccRewards(existingShares,accQuoteRewardsPerShare) - userData.quoteRewardDebt
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L195 | (newAccBaseRewardsPerShare,newAccQuoteRewardsPerShare) = getAccRewardsPerShare(self)
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L197 | self.pendingBaseRewards > 0
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L199 | delete self.pendingBaseRewards
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L202 | self.pendingQuoteRewards > 0
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L204 | delete self.pendingQuoteRewards
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L214 | totalShares = self.totalShares
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L217 | accBaseRewardsPerShare = self.accBaseRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L218 | accQuoteRewardsPerShare = self.accQuoteRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L220 | self.pendingBaseRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L221 | accBaseRewardsPerShare += ((self.pendingBaseRewards * PRECISION_FACTOR) / uint128(totalShares))
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L224 | self.pendingQuoteRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L225 | accQuoteRewardsPerShare += ((self.pendingQuoteRewards * PRECISION_FACTOR) / uint128(totalShares))

(storage) RewardsTrackerLib.stake(RewardPoolData,address,uint96).userData | self.userRewards[user]
(i) (w) 🔗 RewardsTrackerLib.stake | 🎯#L101 | userData = self.userRewards[user]
(i) (w) 🔗 RewardsTrackerLib.stake | 🎯#L112 | userData.shares += newShares
(i) (w) 🔗 RewardsTrackerLib.stake | 🎯#L116 | userData.baseRewardDebt = uint96(totalAccRewards(existingShares + newShares,accBaseRewardsPerShare))
(i) (w) 🔗 RewardsTrackerLib.stake | 🎯#L117 | userData.quoteRewardDebt = uint96(totalAccRewards(existingShares + newShares,accQuoteRewardsPerShare))
(i) (r) 🔗 RewardsTrackerLib.stake | 🎯#L103 | existingShares = uint96(userData.shares)
(i) (r) 🔗 RewardsTrackerLib.stake | 🎯#L106 | existingShares > 0
(i) (r) 🔗 RewardsTrackerLib.stake | 🎯#L107 | baseAmount = totalAccRewards(existingShares,accBaseRewardsPerShare) - userData.baseRewardDebt
(i) (r) 🔗 RewardsTrackerLib.stake | 🎯#L108 | quoteAmount = totalAccRewards(existingShares,accQuoteRewardsPerShare) - userData.quoteRewardDebt

(storage) RewardsTrackerLib.unstake(RewardPoolData,address,uint96).self |
(i) (w) 🔗 RewardsTrackerLib.unstake | 🎯#L138 | userData.shares -= removeShares
(i) (w) 🔗 RewardsTrackerLib.unstake | 🎯#L139 | self.totalShares -= removeShares
(i) (w) 🔗 RewardsTrackerLib.unstake | 🎯#L142 | userData.baseRewardDebt = uint96(totalAccRewards(existingShares - removeShares,accBaseRewardsPerShare))
(i) (w) 🔗 RewardsTrackerLib.unstake | 🎯#L143 | userData.quoteRewardDebt = uint96(totalAccRewards(existingShares - removeShares,accQuoteRewardsPerShare))
(i) (w) 🔗 RewardsTrackerLib.update | 🎯#L198 | self.accBaseRewardPerShare = newAccBaseRewardsPerShare
(i) (w) 🔗 RewardsTrackerLib.update | 🎯#L203 | self.accQuoteRewardPerShare = newAccQuoteRewardsPerShare
(i) (r*) 🔗 RewardsTrackerLib.unstake | 🎯#L124 | (accBaseRewardsPerShare,accQuoteRewardsPerShare) = self.update()
(i) (r) 🔗 RewardsTrackerLib.unstake | 🎯#L126 | userData = self.userRewards[user]
(i) (r) 🔗 RewardsTrackerLib.unstake | 🎯#L130 | existingShares = uint256(userData.shares)
(i) (r) 🔗 RewardsTrackerLib.unstake | 🎯#L131 | existingShares < removeShares
(i) (r) 🔗 RewardsTrackerLib.unstake | 🎯#L134 | baseAmount = totalAccRewards(existingShares,accBaseRewardsPerShare) - userData.baseRewardDebt
(i) (r) 🔗 RewardsTrackerLib.unstake | 🎯#L135 | quoteAmount = totalAccRewards(existingShares,accQuoteRewardsPerShare) - userData.quoteRewardDebt
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L195 | (newAccBaseRewardsPerShare,newAccQuoteRewardsPerShare) = getAccRewardsPerShare(self)
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L197 | self.pendingBaseRewards > 0
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L199 | delete self.pendingBaseRewards
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L202 | self.pendingQuoteRewards > 0
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L204 | delete self.pendingQuoteRewards
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L214 | totalShares = self.totalShares
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L217 | accBaseRewardsPerShare = self.accBaseRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L218 | accQuoteRewardsPerShare = self.accQuoteRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L220 | self.pendingBaseRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L221 | accBaseRewardsPerShare += ((self.pendingBaseRewards * PRECISION_FACTOR) / uint128(totalShares))
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L224 | self.pendingQuoteRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L225 | accQuoteRewardsPerShare += ((self.pendingQuoteRewards * PRECISION_FACTOR) / uint128(totalShares))

(storage) RewardsTrackerLib.unstake(RewardPoolData,address,uint96).userData | self.userRewards[user]
(i) (w) 🔗 RewardsTrackerLib.unstake | 🎯#L126 | userData = self.userRewards[user]
(i) (w) 🔗 RewardsTrackerLib.unstake | 🎯#L138 | userData.shares -= removeShares
(i) (w) 🔗 RewardsTrackerLib.unstake | 🎯#L142 | userData.baseRewardDebt = uint96(totalAccRewards(existingShares - removeShares,accBaseRewardsPerShare))
(i) (w) 🔗 RewardsTrackerLib.unstake | 🎯#L143 | userData.quoteRewardDebt = uint96(totalAccRewards(existingShares - removeShares,accQuoteRewardsPerShare))
(i) (r) 🔗 RewardsTrackerLib.unstake | 🎯#L130 | existingShares = uint256(userData.shares)
(i) (r) 🔗 RewardsTrackerLib.unstake | 🎯#L131 | existingShares < removeShares
(i) (r) 🔗 RewardsTrackerLib.unstake | 🎯#L134 | baseAmount = totalAccRewards(existingShares,accBaseRewardsPerShare) - userData.baseRewardDebt
(i) (r) 🔗 RewardsTrackerLib.unstake | 🎯#L135 | quoteAmount = totalAccRewards(existingShares,accQuoteRewardsPerShare) - userData.quoteRewardDebt

(storage) RewardsTrackerLib.claim(RewardPoolData,address).self |
(i) (w) 🔗 RewardsTrackerLib.claim | 🎯#L165 | userData.baseRewardDebt = uint96(totalAccBaseRewards)
(i) (w) 🔗 RewardsTrackerLib.claim | 🎯#L166 | userData.quoteRewardDebt = uint96(totalAccQuoteRewards)
(i) (w) 🔗 RewardsTrackerLib.update | 🎯#L198 | self.accBaseRewardPerShare = newAccBaseRewardsPerShare
(i) (w) 🔗 RewardsTrackerLib.update | 🎯#L203 | self.accQuoteRewardPerShare = newAccQuoteRewardsPerShare
(i) (r*) 🔗 RewardsTrackerLib.claim | 🎯#L155 | (accBaseRewardsPerShare,accQuoteRewardsPerShare) = self.update()
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L150 | userData = self.userRewards[user]
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L151 | shares = uint256(userData.shares)
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L153 | shares == 0
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L158 | totalAccBaseRewards = totalAccRewards(shares,accBaseRewardsPerShare)
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L159 | totalAccQuoteRewards = totalAccRewards(shares,accQuoteRewardsPerShare)
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L161 | baseAmount = totalAccBaseRewards - uint128(userData.baseRewardDebt)
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L162 | quoteAmount = totalAccQuoteRewards - uint128(userData.quoteRewardDebt)
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L195 | (newAccBaseRewardsPerShare,newAccQuoteRewardsPerShare) = getAccRewardsPerShare(self)
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L197 | self.pendingBaseRewards > 0
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L199 | delete self.pendingBaseRewards
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L202 | self.pendingQuoteRewards > 0
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L204 | delete self.pendingQuoteRewards
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L214 | totalShares = self.totalShares
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L217 | accBaseRewardsPerShare = self.accBaseRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L218 | accQuoteRewardsPerShare = self.accQuoteRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L220 | self.pendingBaseRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L221 | accBaseRewardsPerShare += ((self.pendingBaseRewards * PRECISION_FACTOR) / uint128(totalShares))
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L224 | self.pendingQuoteRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L225 | accQuoteRewardsPerShare += ((self.pendingQuoteRewards * PRECISION_FACTOR) / uint128(totalShares))

(storage) RewardsTrackerLib.claim(RewardPoolData,address).userData | self.userRewards[user]
(i) (w) 🔗 RewardsTrackerLib.claim | 🎯#L150 | userData = self.userRewards[user]
(i) (w) 🔗 RewardsTrackerLib.claim | 🎯#L165 | userData.baseRewardDebt = uint96(totalAccBaseRewards)
(i) (w) 🔗 RewardsTrackerLib.claim | 🎯#L166 | userData.quoteRewardDebt = uint96(totalAccQuoteRewards)
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L151 | shares = uint256(userData.shares)
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L153 | shares == 0
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L158 | totalAccBaseRewards = totalAccRewards(shares,accBaseRewardsPerShare)
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L159 | totalAccQuoteRewards = totalAccRewards(shares,accQuoteRewardsPerShare)
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L161 | baseAmount = totalAccBaseRewards - uint128(userData.baseRewardDebt)
(i) (r) 🔗 RewardsTrackerLib.claim | 🎯#L162 | quoteAmount = totalAccQuoteRewards - uint128(userData.quoteRewardDebt)

(storage) RewardsTrackerLib.getPendingRewards(RewardPoolData,address).self |
(i) (r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L174 | (accBaseRewardsPerShare,accQuoteRewardsPerShare) = getAccRewardsPerShare(self)
(i) (r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L176 | userData = self.userRewards[user]
(i) (r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L177 | shares = uint256(userData.shares)
(i) (r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L182 | baseAmount = totalAccRewards(shares,accBaseRewardsPerShare) - uint128(userData.baseRewardDebt)
(i) (r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L183 | quoteAmount = totalAccRewards(shares,accQuoteRewardsPerShare) - uint128(userData.quoteRewardDebt)
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L214 | totalShares = self.totalShares
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L217 | accBaseRewardsPerShare = self.accBaseRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L218 | accQuoteRewardsPerShare = self.accQuoteRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L220 | self.pendingBaseRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L221 | accBaseRewardsPerShare += ((self.pendingBaseRewards * PRECISION_FACTOR) / uint128(totalShares))
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L224 | self.pendingQuoteRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L225 | accQuoteRewardsPerShare += ((self.pendingQuoteRewards * PRECISION_FACTOR) / uint128(totalShares))

(storage) RewardsTrackerLib.getPendingRewards(RewardPoolData,address).userData | self.userRewards[user]
(i) (w) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L176 | userData = self.userRewards[user]
(i) (r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L177 | shares = uint256(userData.shares)
(i) (r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L182 | baseAmount = totalAccRewards(shares,accBaseRewardsPerShare) - uint128(userData.baseRewardDebt)
(i) (r) 🔗 RewardsTrackerLib.getPendingRewards | 🎯🟩#L183 | quoteAmount = totalAccRewards(shares,accQuoteRewardsPerShare) - uint128(userData.quoteRewardDebt)

(storage) RewardsTrackerLib.update(RewardPoolData).self |
(i) (w) 🔗 RewardsTrackerLib.update | 🎯#L198 | self.accBaseRewardPerShare = newAccBaseRewardsPerShare
(i) (w) 🔗 RewardsTrackerLib.update | 🎯#L199 | delete self.pendingBaseRewards
(i) (w) 🔗 RewardsTrackerLib.update | 🎯#L203 | self.accQuoteRewardPerShare = newAccQuoteRewardsPerShare
(i) (w) 🔗 RewardsTrackerLib.update | 🎯#L204 | delete self.pendingQuoteRewards
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L195 | (newAccBaseRewardsPerShare,newAccQuoteRewardsPerShare) = getAccRewardsPerShare(self)
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L197 | self.pendingBaseRewards > 0
(i) (r) 🔗 RewardsTrackerLib.update | 🎯#L202 | self.pendingQuoteRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L214 | totalShares = self.totalShares
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L217 | accBaseRewardsPerShare = self.accBaseRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L218 | accQuoteRewardsPerShare = self.accQuoteRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L220 | self.pendingBaseRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L221 | accBaseRewardsPerShare += ((self.pendingBaseRewards * PRECISION_FACTOR) / uint128(totalShares))
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L224 | self.pendingQuoteRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L225 | accQuoteRewardsPerShare += ((self.pendingQuoteRewards * PRECISION_FACTOR) / uint128(totalShares))

(storage) RewardsTrackerLib.getAccRewardsPerShare(RewardPoolData).self |
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L214 | totalShares = self.totalShares
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L215 | (self.accBaseRewardPerShare,self.accQuoteRewardPerShare)
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L217 | accBaseRewardsPerShare = self.accBaseRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L218 | accQuoteRewardsPerShare = self.accQuoteRewardPerShare
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L220 | self.pendingBaseRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L221 | accBaseRewardsPerShare += ((self.pendingBaseRewards * PRECISION_FACTOR) / uint128(totalShares))
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L224 | self.pendingQuoteRewards > 0
(i) (r) 🔗 RewardsTrackerLib.getAccRewardsPerShare | 🎯🟢🟩#L225 | accQuoteRewardsPerShare += ((self.pendingQuoteRewards * PRECISION_FACTOR) / uint128(totalShares))

Solidity Vars Used

msg.sender
msg.sender @ 🔗 Launchpad.decreaseStake#427:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.decreaseStake(msg.sender,account,shares)
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
msg.sender @ 🔗 Distributor.claimRewards#162:9 | 🎯💥 | (baseAmount,quoteAmount) = rs.claim(msg.sender)
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)
msg.sender @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
msg.sender @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 Launchpad.increaseStake#423:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.increaseStake(msg.sender,account,shares)
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor

block.timestamp
block.timestamp @ 🔗 GTELaunchpadV2Pair._update#132:9 | 🎯🟢🔴 | blockTimestamp = uint32(block.timestamp % 2 ** 32)
block.timestamp @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

msg.value
msg.value @ 🔗 Launchpad.launch#244:13 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | msg.value != launchFee

this
this @ 🔗 GTELaunchpadV2Pair.sync#316:9 | 🎯💥🟢🌀 ['lock'] | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
this @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))

modifiers_html

functions_html

RewardsTrackerStorage,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/libraries/RewardsTracker.sol#234:1

state_vars_html

(storage) RewardsTrackerStorage.getRewardPool(address).p |

Solidity Vars Used

msg.sender
msg.sender @ 🔗 Launchpad.decreaseStake#427:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.decreaseStake(msg.sender,account,shares)
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
msg.sender @ 🔗 Distributor.claimRewards#162:9 | 🎯💥 | (baseAmount,quoteAmount) = rs.claim(msg.sender)
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)
msg.sender @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
msg.sender @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 Launchpad.increaseStake#423:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.increaseStake(msg.sender,account,shares)
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor

block.timestamp
block.timestamp @ 🔗 GTELaunchpadV2Pair._update#132:9 | 🎯🟢🔴 | blockTimestamp = uint32(block.timestamp % 2 ** 32)
block.timestamp @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

msg.value
msg.value @ 🔗 Launchpad.launch#244:13 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | msg.value != launchFee

this
this @ 🔗 GTELaunchpadV2Pair.sync#316:9 | 🎯💥🟢🌀 ['lock'] | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
this @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))

modifiers_html

functions_html

GTELaunchpadV2Pair,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/uniswap/GTELaunchpadV2Pair.sol#17:1

state_vars_html

(i) UniswapV2ERC20.totalSupply |
(w) 🔗 UniswapV2ERC20._mint | 🟢🔴#L38 | totalSupply = totalSupply.add(value)
(w) 🔗 UniswapV2ERC20._burn | 🟢🔴#L45 | totalSupply = totalSupply.sub(value)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L171 | numerator = totalSupply.mul(rootK.sub(rootKLast))
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L173 | liquidity = numerator / denominator
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L196 | liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0,amount1.mul(_totalSupply) / _reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L217 | amount0 = liquidity.mul(balance0) / _totalSupply
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L218 | amount1 = liquidity.mul(balance1) / _totalSupply
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L219 | amount0 == 0 || amount1 == 0
(r) 🔗 UniswapV2ERC20._mint | 🟢🔴#L38 | totalSupply = totalSupply.add(value)

(i) UniswapV2ERC20.balanceOf |
(w) 🔗 UniswapV2ERC20._mint | 🟢🔴#L39 | balanceOf[to] = balanceOf[to].add(value)
(w) 🔗 UniswapV2ERC20._burn | 🟢🔴#L44 | balanceOf[from] = balanceOf[from].sub(value)
(w) 🔗 UniswapV2ERC20._transfer | 🟢🔴#L55 | balanceOf[from] = balanceOf[from].sub(value)
(w) 🔗 UniswapV2ERC20._transfer | 🟢🔴#L56 | balanceOf[to] = balanceOf[to].add(value)
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L213 | liquidity = balanceOf[address(this)]
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L217 | amount0 = liquidity.mul(balance0) / _totalSupply
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L218 | amount1 = liquidity.mul(balance1) / _totalSupply
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L219 | amount0 == 0 || amount1 == 0
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L220 | _burn(address(this),liquidity)
(r) 🔗 UniswapV2ERC20._mint | 🟢🔴#L39 | balanceOf[to] = balanceOf[to].add(value)
(r) 🔗 UniswapV2ERC20._transfer | 🟢🔴#L55 | balanceOf[from] = balanceOf[from].sub(value)
(r) 🔗 UniswapV2ERC20._transfer | 🟢🔴#L56 | balanceOf[to] = balanceOf[to].add(value)

(i) UniswapV2ERC20.allowance |
(w) 🔗 UniswapV2ERC20._approve | 🔴#L50 | allowance[owner][spender] = value
(w) 🔗 UniswapV2ERC20.transferFrom | 💥🟢🔴#L72 | allowance[from][msg.sender] = allowance[from][msg.sender].sub(value)
(r) 🔗 UniswapV2ERC20.transferFrom | 💥🟢🔴#L71 | allowance[from][msg.sender] != type()(uint256).max
(r) 🔗 UniswapV2ERC20.transferFrom | 💥🟢🔴#L72 | allowance[from][msg.sender] = allowance[from][msg.sender].sub(value)
    (🔀?allowance[from][msg.sender]?)  (w) 🔗 GTL.queueWithdrawal | 🎯💥🟢🔴#L107 | _queuedShares[msg.sender] += shares
    (🔀?allowance[from][msg.sender]?)  (w) 🔗 GTL.cancelWithdrawal | 🎯💥🟢🔴#L117 | _queuedShares[msg.sender] -= _queuedWithdrawal[id].shares

(i) UniswapV2ERC20.DOMAIN_SEPARATOR |
(r) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L82 | digest = keccak256(bytes)(abi.encodePacked(,DOMAIN_SEPARATOR,keccak256(bytes)(abi.encode(PERMIT_TYPEHASH,owner,spender,value,nonces[owner] ++,deadline))))
(r) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L89 | recoveredAddress = ecrecover(bytes32,uint8,bytes32,bytes32)(digest,v,r,s)
(r) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L90 | require(bool,string)(recoveredAddress != address(0) && recoveredAddress == owner,UniswapV2: INVALID_SIGNATURE)

(i) UniswapV2ERC20.nonces |
(w) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L82 | digest = keccak256(bytes)(abi.encodePacked(,DOMAIN_SEPARATOR,keccak256(bytes)(abi.encode(PERMIT_TYPEHASH,owner,spender,value,nonces[owner] ++,deadline))))
(r) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L89 | recoveredAddress = ecrecover(bytes32,uint8,bytes32,bytes32)(digest,v,r,s)
(r) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L90 | require(bool,string)(recoveredAddress != address(0) && recoveredAddress == owner,UniswapV2: INVALID_SIGNATURE)

GTELaunchpadV2Pair.launchpadLp |
(i) (w) 🔗 GTELaunchpadV2Pair.initialize | 🎯💥🟢🔴#L92 | launchpadLp = _launchpadLp
(i) (r) 🔗 GTELaunchpadV2Pair._getLaunchpadFees | 🎯🟢🟩🌀#L282 | launchpadLpBal = this.balanceOf(launchpadLp) + MINIMUM_LIQUIDITY
(i) (r) 🔗 GTELaunchpadV2Pair._getLaunchpadFees | 🎯🟢🟩🌀#L284 | fee0 = uint112(amount0In.mul(REWARDS_FEE_SHARE).mul(launchpadLpBal) / (totalLpBal * 1000))
(i) (r) 🔗 GTELaunchpadV2Pair._getLaunchpadFees | 🎯🟢🟩🌀#L285 | fee1 = uint112(amount1In.mul(REWARDS_FEE_SHARE).mul(launchpadLpBal) / (totalLpBal * 1000))

GTELaunchpadV2Pair.launchpadFeeDistributor |
(i) (w) 🔗 GTELaunchpadV2Pair.initialize | 🎯💥🟢🔴#L93 | launchpadFeeDistributor = _launchpadFeeDistributor
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L139 | launchpadFeeDistributor > address(0)
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L146 | launchpadFeeDistributor > address(0) && newLaunchpadFee0 | newLaunchpadFee1 > 0
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L263 | launchpadFeeDistributor > address(0) && rewardsPoolActive > 0
(i) (r) 🔗 GTELaunchpadV2Pair._distributeLaunchpadFees | 🎯🟢🌀#L294 | distributor = launchpadFeeDistributor
(i) (r) 🔗 GTELaunchpadV2Pair._distributeLaunchpadFees | 🎯🟢🌀#L297 | _safeApprove(_token0,distributor,uint256(fee0))
(i) (r) 🔗 GTELaunchpadV2Pair._distributeLaunchpadFees | 🎯🟢🌀#L298 | _safeApprove(_token1,distributor,uint256(fee1))
(i) (r) 🔗 GTELaunchpadV2Pair._distributeLaunchpadFees | 🎯🟢🌀#L300 | IDistributor(distributor).addRewards(_token0,_token1,uint128(fee0),uint128(fee1))
(i) (r) 🔗 GTELaunchpadV2Pair.endRewardsAccrual | 🎯💥🟢🔴🌀#L98 | msg.sender != launchpadFeeDistributor

GTELaunchpadV2Pair.factory |
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L163 | feeTo = IUniswapV2Factory(factory).feeTo()
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L164 | feeOn = feeTo != address(0)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L174 | _mint(feeTo,liquidity)

GTELaunchpadV2Pair.token0 |
(i) (r*) 🔗 GTELaunchpadV2Pair.endRewardsAccrual | 🎯💥🟢🔴🌀#L105 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
(i) (r*) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L201 | _update(balance0,balance1,_reserve0,_reserve1,uint112(0),uint112(0))
(i) (r*) 🔗 GTELaunchpadV2Pair.sync | 🎯💥🟢🌀 ['lock']#L316 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L185 | balance0 = IERC20(token0).balanceOf(address(this))
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L187 | amount0 = balance0.sub(_reserve0)
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L193 | liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY)
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L196 | liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0,amount1.mul(_totalSupply) / _reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L211 | balance0 = IERC20(_token0).balanceOf(address(this))
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L217 | amount0 = liquidity.mul(balance0) / _totalSupply
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L219 | amount0 == 0 || amount1 == 0
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L221 | _safeTransfer(_token0,to,amount0)
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L223 | balance0 = IERC20(_token0).balanceOf(address(this))
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L243 | to == _token0 || to == _token1
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L244 | _safeTransfer(_token0,to,amount0Out)
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L247 | balance0 = IERC20(_token0).balanceOf(address(this))
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L250 | amount0In = balance0 - (_reserve0 - amount0Out)
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L252 | amount0In == 0 && amount1In == 0
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L256 | balance0Adjusted = balance0.mul(1000).sub(amount0In.mul(3))
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L259 | balance0Adjusted.mul(balance1Adjusted) < uint256(_reserve0).mul(_reserve1).mul(1000 ** 2)
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L263 | (launchpadFee0,launchpadFee1) = _getLaunchpadFees(amount0In,amount1In)
(i) (r) 🔗 GTELaunchpadV2Pair._distributeLaunchpadFees | 🎯🟢🌀#L297 | _safeApprove(_token0,distributor,uint256(fee0))
(i) (r) 🔗 GTELaunchpadV2Pair._distributeLaunchpadFees | 🎯🟢🌀#L300 | IDistributor(distributor).addRewards(_token0,_token1,uint128(fee0),uint128(fee1))
(i) (r) 🔗 GTELaunchpadV2Pair.skim | 🎯💥🟢🌀 ['lock']#L310 | _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))

GTELaunchpadV2Pair.token1 |
(i) (r*) 🔗 GTELaunchpadV2Pair.endRewardsAccrual | 🎯💥🟢🔴🌀#L105 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
(i) (r*) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L201 | _update(balance0,balance1,_reserve0,_reserve1,uint112(0),uint112(0))
(i) (r*) 🔗 GTELaunchpadV2Pair.sync | 🎯💥🟢🌀 ['lock']#L316 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L186 | balance1 = IERC20(token1).balanceOf(address(this))
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L188 | amount1 = balance1.sub(_reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L193 | liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY)
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L196 | liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0,amount1.mul(_totalSupply) / _reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L212 | balance1 = IERC20(_token1).balanceOf(address(this))
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L218 | amount1 = liquidity.mul(balance1) / _totalSupply
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L219 | amount0 == 0 || amount1 == 0
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L222 | _safeTransfer(_token1,to,amount1)
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L224 | balance1 = IERC20(_token1).balanceOf(address(this))
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L243 | to == _token0 || to == _token1
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L245 | _safeTransfer(_token1,to,amount1Out)
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L248 | balance1 = IERC20(_token1).balanceOf(address(this))
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L251 | balance1 > _reserve1 - amount1Out
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L252 | amount0In == 0 && amount1In == 0
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L257 | balance1Adjusted = balance1.mul(1000).sub(amount1In.mul(3))
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L259 | balance0Adjusted.mul(balance1Adjusted) < uint256(_reserve0).mul(_reserve1).mul(1000 ** 2)
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L263 | (launchpadFee0,launchpadFee1) = _getLaunchpadFees(amount0In,amount1In)
(i) (r) 🔗 GTELaunchpadV2Pair._distributeLaunchpadFees | 🎯🟢🌀#L298 | _safeApprove(_token1,distributor,uint256(fee1))
(i) (r) 🔗 GTELaunchpadV2Pair._distributeLaunchpadFees | 🎯🟢🌀#L300 | IDistributor(distributor).addRewards(_token0,_token1,uint128(fee0),uint128(fee1))
(i) (r) 🔗 GTELaunchpadV2Pair.skim | 🎯💥🟢🌀 ['lock']#L311 | _safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))

GTELaunchpadV2Pair.reserve0 |
(i) (w) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L154 | reserve0 = _reserve0 = uint112(balance0) - totalLaunchpadFee0
(i) (r*) 🔗 GTELaunchpadV2Pair.endRewardsAccrual | 🎯💥🟢🔴🌀#L105 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
(i) (r*) 🔗 GTELaunchpadV2Pair.sync | 🎯💥🟢🌀 ['lock']#L316 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L169 | rootKLast = Math.sqrt(_kLast)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L171 | numerator = totalSupply.mul(rootK.sub(rootKLast))
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L172 | denominator = rootK.mul(5).add(rootKLast)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L173 | liquidity = numerator / denominator
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L202 | kLast = uint256(reserve0).mul(reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L227 | kLast = uint256(reserve0).mul(reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.skim | 🎯💥🟢🌀 ['lock']#L310 | _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))
(i) (r) 🔗 GTELaunchpadV2Pair.getReserves | 🎯💥🟢🟩#L61 | (_reserve0,_reserve1,_blockTimestampLast)

GTELaunchpadV2Pair.reserve1 |
(i) (w) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L155 | reserve1 = _reserve1 = uint112(balance1) - totalLaunchpadFee1
(i) (r*) 🔗 GTELaunchpadV2Pair.endRewardsAccrual | 🎯💥🟢🔴🌀#L105 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
(i) (r*) 🔗 GTELaunchpadV2Pair.sync | 🎯💥🟢🌀 ['lock']#L316 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L169 | rootKLast = Math.sqrt(_kLast)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L171 | numerator = totalSupply.mul(rootK.sub(rootKLast))
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L172 | denominator = rootK.mul(5).add(rootKLast)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L173 | liquidity = numerator / denominator
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L202 | kLast = uint256(reserve0).mul(reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L227 | kLast = uint256(reserve0).mul(reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.skim | 🎯💥🟢🌀 ['lock']#L311 | _safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))
(i) (r) 🔗 GTELaunchpadV2Pair.getReserves | 🎯💥🟢🟩#L61 | (_reserve0,_reserve1,_blockTimestampLast)

GTELaunchpadV2Pair.blockTimestampLast |
(i) (w) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L157 | blockTimestampLast = blockTimestamp
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L133 | timeElapsed = blockTimestamp - blockTimestampLast
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L134 | timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L136 | price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L137 | price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed
(i) (r) 🔗 GTELaunchpadV2Pair.getReserves | 🎯💥🟢🟩#L61 | (_reserve0,_reserve1,_blockTimestampLast)
(i) (r) 🔗 GTELaunchpadV2Pair.getReserves | 🎯💥🟢🟩#L64 | _blockTimestampLast = blockTimestampLast
(i) (r) 🔗 GTELaunchpadV2Pair.getAccruedLaunchpadFees | 🎯💥🟢🟩#L68 | (accruedLaunchpadFee0,accruedLaunchpadFee1,blockTimestampLast)

GTELaunchpadV2Pair.price0CumulativeLast |
(i) (w) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L136 | price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed

GTELaunchpadV2Pair.price1CumulativeLast |
(i) (w) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L137 | price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed

GTELaunchpadV2Pair.kLast |
(i) (w) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L202 | kLast = uint256(reserve0).mul(reserve1)
(i) (w) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L227 | kLast = uint256(reserve0).mul(reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L169 | rootKLast = Math.sqrt(_kLast)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L171 | numerator = totalSupply.mul(rootK.sub(rootKLast))
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L172 | denominator = rootK.mul(5).add(rootKLast)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L173 | liquidity = numerator / denominator

GTELaunchpadV2Pair.accruedLaunchpadFee0 |
(i) (w) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L141 | delete accruedLaunchpadFee0
(i) (w) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L147 | accruedLaunchpadFee0 = totalLaunchpadFee0
(i) (r*) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L143 | _distributeLaunchpadFees(totalLaunchpadFee0,totalLaunchpadFee1)
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L129 | totalLaunchpadFee0 = accruedLaunchpadFee0 + newLaunchpadFee0
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L134 | timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L136 | price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L137 | price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L140 | totalLaunchpadFee0 | totalLaunchpadFee1 > 0
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L154 | reserve0 = _reserve0 = uint112(balance0) - totalLaunchpadFee0
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L169 | rootKLast = Math.sqrt(_kLast)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L171 | numerator = totalSupply.mul(rootK.sub(rootKLast))
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L172 | denominator = rootK.mul(5).add(rootKLast)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L173 | liquidity = numerator / denominator
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L202 | kLast = uint256(reserve0).mul(reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L227 | kLast = uint256(reserve0).mul(reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.skim | 🎯💥🟢🌀 ['lock']#L310 | _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))
(i) (r) 🔗 GTELaunchpadV2Pair.getAccruedLaunchpadFees | 🎯💥🟢🟩#L68 | (accruedLaunchpadFee0,accruedLaunchpadFee1,blockTimestampLast)

GTELaunchpadV2Pair.accruedLaunchpadFee1 |
(i) (w) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L142 | delete accruedLaunchpadFee1
(i) (w) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L148 | accruedLaunchpadFee1 = totalLaunchpadFee1
(i) (r*) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L143 | _distributeLaunchpadFees(totalLaunchpadFee0,totalLaunchpadFee1)
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L130 | totalLaunchpadFee1 = accruedLaunchpadFee1 + newLaunchpadFee1
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L134 | timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L136 | price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L137 | price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L140 | totalLaunchpadFee0 | totalLaunchpadFee1 > 0
(i) (r) 🔗 GTELaunchpadV2Pair._update | 🎯🟢🔴#L155 | reserve1 = _reserve1 = uint112(balance1) - totalLaunchpadFee1
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L169 | rootKLast = Math.sqrt(_kLast)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L171 | numerator = totalSupply.mul(rootK.sub(rootKLast))
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L172 | denominator = rootK.mul(5).add(rootKLast)
(i) (r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L173 | liquidity = numerator / denominator
(i) (r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L202 | kLast = uint256(reserve0).mul(reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L227 | kLast = uint256(reserve0).mul(reserve1)
(i) (r) 🔗 GTELaunchpadV2Pair.skim | 🎯💥🟢🌀 ['lock']#L311 | _safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))
(i) (r) 🔗 GTELaunchpadV2Pair.getAccruedLaunchpadFees | 🎯💥🟢🟩#L68 | (accruedLaunchpadFee0,accruedLaunchpadFee1,blockTimestampLast)

GTELaunchpadV2Pair.rewardsPoolActive | 1
(i) (r) 🔗 GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock']#L263 | launchpadFeeDistributor > address(0) && rewardsPoolActive > 0

GTELaunchpadV2Pair.unlocked | 1

Solidity Vars Used

block.timestamp
block.timestamp @ 🔗 UniswapV2ERC20.permit#81:9 | 💥🟢🔴 | require(bool,string)(deadline >= block.timestamp,UniswapV2: EXPIRED)
block.timestamp @ 🔗 UniswapV2ERC20.permit#81:9 | 💥🟢🔴 | require(bool,string)(deadline >= block.timestamp,UniswapV2: EXPIRED)
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})
block.timestamp @ 🔗 GTELaunchpadV2Pair._update#132:9 | 🎯🟢🔴 | blockTimestamp = uint32(block.timestamp % 2 ** 32)
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

msg.sender
msg.sender @ 🔗 UniswapV2ERC20.approve#61:9 | 💥 | _approve(msg.sender,spender,value)
msg.sender @ 🔗 GTELaunchpadV2PairFactory.createPair#36:9 | 🎯💥🟢🔴🌀 | msg.sender == launchpad
msg.sender @ 🔗 UniswapV2ERC20.transfer#66:9 | 💥 | _transfer(msg.sender,to,value)
msg.sender @ 🔗 UniswapV2ERC20.transferFrom#71:13 | 💥🟢🔴 | allowance[from][msg.sender] != type()(uint256).max
msg.sender @ 🔗 UniswapV2ERC20.transferFrom#72:13 | 💥🟢🔴 | allowance[from][msg.sender] = allowance[from][msg.sender].sub(value)
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 GTELaunchpadV2Pair.constructor#82:9 | 🎯💥🔴 | factory = msg.sender
msg.sender @ 🔗 GTELaunchpadV2Pair.initialize#89:13 | 🎯💥🟢🔴 | msg.sender != factory
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 UniswapV2ERC20.approve#61:9 | 💥 | _approve(msg.sender,spender,value)
msg.sender @ 🔗 UniswapV2ERC20.transfer#66:9 | 💥 | _transfer(msg.sender,to,value)
msg.sender @ 🔗 UniswapV2ERC20.transferFrom#71:13 | 💥🟢🔴 | allowance[from][msg.sender] != type()(uint256).max
msg.sender @ 🔗 UniswapV2ERC20.transferFrom#72:13 | 💥🟢🔴 | allowance[from][msg.sender] = allowance[from][msg.sender].sub(value)
msg.sender @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
msg.sender @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))

this
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair._getLaunchpadFees#281:9 | 🎯🟢🟩🌀 | totalLpBal = this.totalSupply()
this @ 🔗 GTELaunchpadV2Pair._getLaunchpadFees#282:9 | 🎯🟢🟩🌀 | launchpadLpBal = this.balanceOf(launchpadLp) + MINIMUM_LIQUIDITY
this @ 🔗 GTELaunchpadV2Pair.skim#310:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))
this @ 🔗 GTELaunchpadV2Pair.skim#311:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))
this @ 🔗 GTELaunchpadV2Pair.sync#316:9 | 🎯💥🟢🌀 ['lock'] | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
this @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))

External Calls

GTELaunchpadV2Pair._safeTransfer | 🎯🟢🌀❗ | (bool success, bytes memory data) = token.call(abi.encodeWithSelector(TRANSFER_SELECTOR, to, value))
GTELaunchpadV2Pair._safeApprove | 🎯🟢🌀❗ | (bool success, bytes memory data) = token.call(abi.encodeWithSelector(APPROVE_SELECTOR, to, value))
GTELaunchpadV2Pair.endRewardsAccrual | 🎯💥🟢🔴🌀 | _update( IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1, uint112(0), uint112(0) )
GTELaunchpadV2Pair.endRewardsAccrual | 🎯💥🟢🔴🌀 | _update( IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1, uint112(0), uint112(0) )
GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀 | address feeTo = IUniswapV2Factory(factory).feeTo()
GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock'] | uint256 balance0 = IERC20(token0).balanceOf(address(this))
GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock'] | uint256 balance1 = IERC20(token1).balanceOf(address(this))
GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock'] | uint256 balance0 = IERC20(_token0).balanceOf(address(this))
GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock'] | uint256 balance1 = IERC20(_token1).balanceOf(address(this))
GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data)
GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
GTELaunchpadV2Pair.swap | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
GTELaunchpadV2Pair._getLaunchpadFees | 🎯🟢🟩🌀 | uint256 totalLpBal = this.totalSupply()
GTELaunchpadV2Pair._getLaunchpadFees | 🎯🟢🟩🌀 | uint256 launchpadLpBal = this.balanceOf(launchpadLp) + MINIMUM_LIQUIDITY
GTELaunchpadV2Pair._distributeLaunchpadFees | 🎯🟢🌀 | IDistributor(distributor).addRewards(_token0, _token1, uint128(fee0), uint128(fee1))
GTELaunchpadV2Pair.skim | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))
GTELaunchpadV2Pair.skim | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))
GTELaunchpadV2Pair.sync | 🎯💥🟢🌀 ['lock'] | _update( IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1, uint112(0), uint112(0) )
GTELaunchpadV2Pair.sync | 🎯💥🟢🌀 ['lock'] | _update( IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1, uint112(0), uint112(0) )


modifiers_html

functions_html

GTELaunchpadV2PairFactory,/home/ubuntu/2025-08-gte-perps/contracts/launchpad/uniswap/GTELaunchpadV2PairFactory.sol#7:1

state_vars_html

GTELaunchpadV2PairFactory.feeTo |
GTELaunchpadV2PairFactory.feeToSetter |
(i) (w) 🔗 GTELaunchpadV2PairFactory.constructor | 🎯💥🔴#L19 | feeToSetter = _feeToSetter

GTELaunchpadV2PairFactory.getPair |
(i) (w) 🔗 GTELaunchpadV2PairFactory.createPair | 🎯💥🟢🔴🌀#L44 | getPair[token0][token1] = pair
(i) (w) 🔗 GTELaunchpadV2PairFactory.createPair | 🎯💥🟢🔴🌀#L45 | getPair[token1][token0] = pair
(i) (r) 🔗 GTELaunchpadV2PairFactory.createPair | 🎯💥🟢🔴🌀#L33 | getPair[token0][token1] != address(0)

GTELaunchpadV2PairFactory.allPairs |
(i) (r) 🔗 GTELaunchpadV2PairFactory.createPair | 🎯💥🟢🔴🌀#L47 | PairCreated(token0,token1,pair,allPairs.length)

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTELaunchpadV2Pair.initialize#89:13 | 🎯💥🟢🔴 | msg.sender != factory
msg.sender @ 🔗 GTELaunchpadV2PairFactory.setFeeTo#51:13 | 🎯💥🟢🔴 | msg.sender != feeToSetter
msg.sender @ 🔗 GTELaunchpadV2PairFactory.setFeeToSetter#56:13 | 🎯💥🟢🔴 | msg.sender != feeToSetter
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 GTELaunchpadV2PairFactory.createPair#36:9 | 🎯💥🟢🔴🌀 | msg.sender == launchpad
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)

this
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))

External Calls

GTELaunchpadV2PairFactory.createPair | 🎯💥🟢🔴🌀 | IUniswapV2Pair(pair).initialize(token0, token1, _launchpadLp, _launchpadFeeDistributor)


modifiers_html

functions_html

GTL,/home/ubuntu/2025-08-gte-perps/contracts/perps/GTL.sol#17:1

state_vars_html

GTL._subaccounts |
(i) (r*) 🔗 GTL.addSubaccount | 🎯💥🟢❌ ['onlyPerpManager']#L190 | _subaccounts.add(subaccount)
(i) (r*) 🔗 GTL.removeSubaccount | 🎯💥🟢❌ ['onlyPerpManager']#L194 | _subaccounts.remove(subaccount)
(i) (r*) 🔗 GTL.totalAccountValue | 🎯💥🟢🟩🌀#L206 | subaccounts = _subaccounts.values()
(i) (r*) 🔗 GTL.orderbookCollateral | 🎯💥🟢🟩🌀#L216 | subaccounts = _subaccounts.values()
(i) (r*) 🔗 GTL.getSubaccounts | 🎯💥🟢🟩#L228 | _subaccounts.values()
(r*) 🔗 EnumerableSetLib.add | #L351 | result = add(_toBytes32Set(set),bytes32(value))
(r*) 🔗 EnumerableSetLib.remove | #L478 | result = remove(_toBytes32Set(set),bytes32(value))
(r*) 🔗 EnumerableSetLib.values | 🟩#L583 | result = _toUints(values(_toBytes32Set(set)))
(i) (r) 🔗 GTL.totalAccountValue | 🎯💥🟢🟩🌀#L209 | i < subaccounts.length
(i) (r) 🔗 GTL.totalAccountValue | 🎯💥🟢🟩🌀#L210 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])
(i) (r) 🔗 GTL.totalAccountValue | 🎯💥🟢🟩🌀#L211 | accountValue += subaccountValue.abs()
(i) (r) 🔗 GTL.orderbookCollateral | 🎯💥🟢🟩🌀#L218 | i < subaccounts.length
(i) (r) 🔗 GTL.orderbookCollateral | 🎯💥🟢🟩🌀#L219 | collateral += IViewPort(perpManager).getOrderbookCollateral(address(this),subaccounts[i])
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

GTL._withdrawalQueue |
(i) (w) 🔗 GTL.queueWithdrawal | 🎯💥🟢🔴#L109 | _withdrawalQueue.push(id)
(i) (w) 🔗 GTL._dequeue | 🎯🟢🔴#L282 | _withdrawalQueue = newQueue
(i) (w) 🔗 GTL._dequeueBatch | 🎯🟢🔴#L288 | _withdrawalQueue = withdrawalQueue.slice(num,withdrawalQueue.length)
(i) (r*) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L147 | _burn(withdrawal.account,withdrawal.shares)
(i) (r) 🔗 GTL.cancelWithdrawal | 🎯💥🟢🔴#L115 | _queuedWithdrawal[id].account != msg.sender
(i) (r) 🔗 GTL.cancelWithdrawal | 🎯💥🟢🔴#L117 | _queuedShares[msg.sender] -= _queuedWithdrawal[id].shares
(i) (r) 🔗 GTL.cancelWithdrawal | 🎯💥🟢🔴#L118 | delete _queuedWithdrawal[id]
(i) (r) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L139 | withdrawal = _queuedWithdrawal[id]
(i) (r) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L141 | assets = _convertToAssets({shares:withdrawal.shares,allocatedAssets:allocatedAssets})
(i) (r) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L145 | _queuedShares[withdrawal.account] -= withdrawal.shares
(i) (r) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L149 | usdc.safeTransfer(withdrawal.account,assets)
(i) (r) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L151 | WithdrawalProcessed(id,withdrawal.account,withdrawal.shares,assets)
(i) (r) 🔗 GTL._dequeue | 🎯🟢🔴#L272 | withdrawalQueue = _withdrawalQueue
(i) (r) 🔗 GTL._dequeue | 🎯🟢🔴#L273 | length = withdrawalQueue.length
(i) (r) 🔗 GTL._dequeue | 🎯🟢🔴#L275 | newQueue = new uint256[](length - 1)
(i) (r) 🔗 GTL._dequeue | 🎯🟢🔴#L278 | i < length
(i) (r) 🔗 GTL._dequeue | 🎯🟢🔴#L279 | newQueue[idx ++] = withdrawalQueue[i]
(i) (r) 🔗 GTL._dequeue | 🎯🟢🔴#L279 | withdrawalQueue[i] != id
(i) (r) 🔗 GTL._dequeueBatch | 🎯🟢🔴#L286 | withdrawalQueue = _withdrawalQueue

GTL._withdrawalCounter |
(i) (w) 🔗 GTL.queueWithdrawal | 🎯💥🟢🔴#L105 | id = ++ _withdrawalCounter
(i) (r) 🔗 GTL.queueWithdrawal | 🎯💥🟢🔴#L108 | _queuedWithdrawal[id] = Withdrawal(msg.sender,shares)
(i) (r) 🔗 GTL.queueWithdrawal | 🎯💥🟢🔴#L109 | _withdrawalQueue.push(id)
(i) (r) 🔗 GTL.queueWithdrawal | 🎯💥🟢🔴#L111 | WithdrawalQueued(id,msg.sender,shares)

GTL._queuedWithdrawal |
(i) (w) 🔗 GTL.queueWithdrawal | 🎯💥🟢🔴#L108 | _queuedWithdrawal[id] = Withdrawal(msg.sender,shares)
(i) (w) 🔗 GTL.cancelWithdrawal | 🎯💥🟢🔴#L118 | delete _queuedWithdrawal[id]
(i) (r*) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L147 | _burn(withdrawal.account,withdrawal.shares)
(i) (r) 🔗 GTL.cancelWithdrawal | 🎯💥🟢🔴#L115 | _queuedWithdrawal[id].account != msg.sender
(i) (r) 🔗 GTL.cancelWithdrawal | 🎯💥🟢🔴#L117 | _queuedShares[msg.sender] -= _queuedWithdrawal[id].shares
(i) (r) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L139 | withdrawal = _queuedWithdrawal[id]
(i) (r) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L141 | assets = _convertToAssets({shares:withdrawal.shares,allocatedAssets:allocatedAssets})
(i) (r) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L145 | _queuedShares[withdrawal.account] -= withdrawal.shares
(i) (r) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L149 | usdc.safeTransfer(withdrawal.account,assets)
(i) (r) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L151 | WithdrawalProcessed(id,withdrawal.account,withdrawal.shares,assets)
(i) (r) 🔗 GTL.getQueuedWithdrawal | 🎯💥🟢🟩#L232 | _queuedWithdrawal[id]

GTL._queuedShares |
(i) (w) 🔗 GTL.queueWithdrawal | 🎯💥🟢🔴#L107 | _queuedShares[msg.sender] += shares
(i) (w) 🔗 GTL.cancelWithdrawal | 🎯💥🟢🔴#L117 | _queuedShares[msg.sender] -= _queuedWithdrawal[id].shares
(i) (w) 🔗 GTL.processWithdrawals | 🎯💥🟢🔴❌ ['onlyAdmin']#L145 | _queuedShares[withdrawal.account] -= withdrawal.shares
(i) (r) 🔗 GTL.queueWithdrawal | 🎯💥🟢🔴#L103 | _queuedShares[msg.sender] + shares > balanceOf(msg.sender)
(i) (r) 🔗 GTL.getQueuedShares | 🎯💥🟢🟩#L236 | _queuedShares[account]
(i) (r) 🔗 GTL._afterTokenTransfer | 🎯🟢🟩#L268 | balanceOf(from) < _queuedShares[from]
    (🔀?_queuedShares[msg.sender]?)  (w) 🔗 UniswapV2ERC20.transferFrom | 💥🟢🔴#L72 | allowance[from][msg.sender] = allowance[from][msg.sender].sub(value)

Solidity Vars Used

this
this @ 🔗 GTL.disapproveOperator#178:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).disapproveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})
this @ 🔗 Launchpad.updateQuoteAsset#386:9 | 🎯💥🟢🔴🌀❌ ['onlyOwner'] | LaunchToken(newQuoteAsset).approve(address(this),0)
this @ 🔗 ERC20.DOMAIN_SEPARATOR#484:13 | 💱💥🟢🟩 | mstore(uint256,uint256)(m_DOMAIN_SEPARATOR_asm_0 + 0x80,address()())
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])
this @ 🔗 GTL.orderbookCollateral#219:13 | 🎯💥🟢🟩🌀 | collateral += IViewPort(perpManager).getOrderbookCollateral(address(this),subaccounts[i])
this @ 🔗 GTL.freeCollateralBalance#224:9 | 🎯💥🟢🟩🌀 | IViewPort(perpManager).getFreeCollateralBalance(address(this))
this @ 🔗 ERC20.permit#433:13 | 💥🟢 | mstore(uint256,uint256)(m_permit_asm_1 + 0x80,address()())
this @ 🔗 ERC4626._deposit#456:9 | 🟢 | SafeTransferLib.safeTransferFrom(asset(),by,address(this),assets)
this @ 🔗 ERC4626.totalAssets#153:9 | 💥🟩 | assets = SafeTransferLib.balanceOf(asset(),address(this))
this @ 🔗 Initializable.initializer#71:17 | 🌈🟢 | ! extcodesize(uint256)(address()()) < i_initializer_asm_0 >> 1 == 1
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 ERC20.DOMAIN_SEPARATOR#484:13 | 💱💥🟢🟩 | mstore(uint256,uint256)(m_DOMAIN_SEPARATOR_asm_0 + 0x80,address()())
this @ 🔗 Launchpad.initialize#185:9 | 🎯💥🟢🔴🌀 ['initializer'] | LaunchToken(quoteAsset_).approve(address(this),0)
this @ 🔗 ERC4626._deposit#456:9 | 🟢 | SafeTransferLib.safeTransferFrom(asset(),by,address(this),assets)
this @ 🔗 GTL._convertToAssets#293:9 | 🎯💥🟢🟩 | shares.fullMulDiv(usdc.balanceOf(address(this)) + allocatedAssets + 1,totalSupply() + 1)
this @ 🔗 ERC20.permit#433:13 | 💥🟢 | mstore(uint256,uint256)(m_permit_asm_1 + 0x80,address()())
this @ 🔗 GTL.approveOperator#170:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).approveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})

msg.sender
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 OperatorPanel.onlySenderOrOperatorHub#73:13 | 🎯🌈🟢 | msg.sender != account && msg.sender != operatorHub
msg.sender @ 🔗 ERC4626.withdraw#416:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 GTL.onlyPerpManager#52:13 | 🎯🌈🟢 | msg.sender != perpManager
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 GTL.queueWithdrawal#103:13 | 🎯💥🟢🔴 | _queuedShares[msg.sender] + shares > balanceOf(msg.sender)
msg.sender @ 🔗 GTL.queueWithdrawal#107:9 | 🎯💥🟢🔴 | _queuedShares[msg.sender] += shares
msg.sender @ 🔗 GTL.queueWithdrawal#108:9 | 🎯💥🟢🔴 | _queuedWithdrawal[id] = Withdrawal(msg.sender,shares)
msg.sender @ 🔗 GTL.queueWithdrawal#111:9 | 🎯💥🟢🔴 | WithdrawalQueued(id,msg.sender,shares)
msg.sender @ 🔗 GTL._assertAdmin#297:13 | 🎯🟢🟩 | ! hasAllRoles(msg.sender,ADMIN_ROLE) && msg.sender != owner()
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 GTL.cancelWithdrawal#115:13 | 🎯💥🟢🔴 | _queuedWithdrawal[id].account != msg.sender
msg.sender @ 🔗 GTL.cancelWithdrawal#117:9 | 🎯💥🟢🔴 | _queuedShares[msg.sender] -= _queuedWithdrawal[id].shares
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 ERC4626.withdraw#416:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())

block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

External Calls

GTL.approveOperator | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).approveOperator({ account: address(this), operator: operator, roles: 1 << uint256(PerpsOperatorRoles.ADMIN) })
GTL.disapproveOperator | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).disapproveOperator({ account: address(this), operator: operator, roles: 1 << uint256(PerpsOperatorRoles.ADMIN) })
GTL.totalAccountValue | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this), subaccounts[i])
GTL.orderbookCollateral | 🎯💥🟢🟩🌀 | collateral += IViewPort(perpManager).getOrderbookCollateral(address(this), subaccounts[i])
GTL.freeCollateralBalance | 🎯💥🟢🟩🌀 | return IViewPort(perpManager).getFreeCollateralBalance(address(this))


modifiers_html

functions_html

PerpManager,/home/ubuntu/2025-08-gte-perps/contracts/perps/PerpManager.sol#29:1

state_vars_html

(storage) OperatorPanel._getOperatorStorage().self |
(storage) OperatorPanel.approveOperator(address,address,uint256).self | _getOperatorStorage()
(w) 🔗 OperatorPanel.approveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L92 | self.operatorRoleApprovals[account][operator] = approvedRoles | roles
(r) 🔗 OperatorPanel.approveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L91 | approvedRoles = self.operatorRoleApprovals[account][operator]

(storage) OperatorPanel.disapproveOperator(address,address,uint256).self | _getOperatorStorage()
(w) 🔗 OperatorPanel.disapproveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L104 | self.operatorRoleApprovals[account][operator] = approvedRoles & (~ roles)
(r) 🔗 OperatorPanel.disapproveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L103 | approvedRoles = self.operatorRoleApprovals[account][operator]

(storage) ViewPort.getOrderbookCollateral(address,uint256).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 ViewPort.getOrderbookCollateral | 🎯💥🟩#L89 | clearingHouse = StorageLib.loadClearingHouse()
(r) 🔗 ViewPort.getOrderbookCollateral | 🎯💥🟩#L90 | assets = clearingHouse.assets[account][subaccount].values()
(r) 🔗 ViewPort.getOrderbookCollateral | 🎯💥🟩#L93 | orderbookCollateral += clearingHouse.market[assets[i]].getOrderBookCollateral(account,subaccount)
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ViewPort.getAccountValue(address,uint256).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 ViewPort.getAccountValue | 🎯💥🟩#L98 | clearingHouse = StorageLib.loadClearingHouse()
(r) 🔗 ViewPort.getAccountValue | 🎯💥🟩#L100 | (assets,positions,margin) = clearingHouse.getAccountAndMargin(account,subaccount)
(r) 🔗 ViewPort.getAccountValue | 🎯💥🟩#L103 | fundingPayment = clearingHouse.getFundingPayment(account,subaccount)
(r) 🔗 ViewPort.getAccountValue | 🎯💥🟩#L104 | upnl = clearingHouse.getUpnl(assets,positions)
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getUpnl | 🎯🟩#L410 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib.getFundingPayment | 🎯🟩#L478 | assets = self.assets[account][subaccount].values()
(r) 🔗 ClearingHouseLib.getFundingPayment | 🎯🟩#L481 | fundingPayment += self.market[assets[i]].getFundingPayment(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib.getFundingPayment | 🎯🟩#L403 | position = self.position[account][subaccount]
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ViewPort.getNextEmptySubaccount(address).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 ViewPort.getNextEmptySubaccount | 🎯💥🟩#L134 | clearingHouse = StorageLib.loadClearingHouse()
(r) 🔗 ViewPort.getNextEmptySubaccount | 🎯💥🟩#L137 | clearingHouse.assets[account][i].length() == 0
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ViewPort.getOpenInterest(bytes32).metadata | StorageLib.loadMarketMetadata(asset)
(w) 🔗 ViewPort.getOpenInterest | 🎯💥🟩#L210 | metadata = StorageLib.loadMarketMetadata(asset)
(r) 🔗 ViewPort.getOpenInterest | 🎯💥🟩#L212 | longOi = metadata.longOI
(r) 🔗 ViewPort.getOpenInterest | 🎯💥🟩#L213 | shortOi = metadata.shortOI

(storage) ViewPort.getOpenInterestBook(bytes32).book | StorageLib.loadBook(asset)
(w) 🔗 ViewPort.getOpenInterestBook | 🎯💥🟩#L217 | book = StorageLib.loadBook(asset)
(r) 🔗 ViewPort.getOpenInterestBook | 🎯💥🟩#L219 | baseOi = book.metadata.baseOI
(r) 🔗 ViewPort.getOpenInterestBook | 🎯💥🟩#L220 | quoteOi = book.metadata.quoteOI

(storage) ViewPort.getOpenInterestBackstopBook(bytes32).book | StorageLib.loadBackstopBook(asset)
(w) 🔗 ViewPort.getOpenInterestBackstopBook | 🎯💥🟩#L224 | book = StorageLib.loadBackstopBook(asset)
(r) 🔗 ViewPort.getOpenInterestBackstopBook | 🎯💥🟩#L226 | baseOi = book.metadata.baseOI
(r) 🔗 ViewPort.getOpenInterestBackstopBook | 🎯💥🟩#L227 | quoteOi = book.metadata.quoteOI

(storage) ViewPort.getFundingClamps(bytes32).settings | StorageLib.loadFundingRateSettings(asset)
(w) 🔗 ViewPort.getFundingClamps | 🎯💥🟩#L355 | settings = StorageLib.loadFundingRateSettings(asset)
(r) 🔗 ViewPort.getFundingClamps | 🎯💥🟩#L356 | (settings.innerClamp,settings.outerClamp)

(storage) LiquidatorPanel.liquidate(bytes32,address,uint256).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r*) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L164 | cache = _liquidate({clearingHouse:clearingHouse,asset:asset,account:account,subaccount:subaccount,bookType:BookType.STANDARD})
(r*) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L218 | StorageLib.loadCollateralManager().settleFill(account,subaccount,cache.margin,cache.positionResult.marginDelta)
(r*) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L222 | clearingHouse.updateAccount({account:account,subaccount:subaccount,assets:cache.assets,positions:cache.positions,tradedAsset:asset,positionIdx:cache.positionIdx,oiDelta:cache.positionResult.oiDelta,sideClose:cache.positionResult.sideClose})
(r*) 🔗 LiquidatorPanel._liquidate | 🎯#L629 | cache.fillResult = clearingHouse.market[asset].liquidate({account:account,subaccount:subaccount,side:cache.side,amount:cache.positions[cache.positionIdx].amount,bookType:bookType})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib.liquidate | 🎯#L176 | result = CLOBLib.placeOrder(account,PlaceOrderArgs({subaccount:subaccount,asset:self.asset,side:side,limitPrice:0,amount:amount,baseDenominated:true,tif:TiF.IOC,expiryTime:0,clientOrderId:0,reduceOnly:true}),bookType)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L172 | fee = StorageLib.loadMarketSettings(asset).liquidationFeeRate.fullMulDiv(cache.fillResult.quoteTraded,1e18).toInt256()
(r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L179 | (cache.margin,cache.positionResult.marginDelta) = clearingHouse.rebalanceClose({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L186 | fullClose = cache.positions[cache.positionIdx].amount == 0 && cache.positions.length == 1
(r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L189 | fullClose && cache.positionResult.marginDelta < 0
(r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L191 | cache.positionResult.marginDelta.abs() < cache.maintenanceOrProratedMargin
(r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L202 | _emitLiquidationEvent({asset:asset,account:account,subaccount:subaccount,side:cache.side,quoteTraded:cache.fillResult.quoteTraded,baseTraded:cache.fillResult.baseTraded,rpnl:cache.positionResult.rpnl,margin:cache.margin,fee:fee,liquidationType:LiquidationType.LIQUIDATEE})
(r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L600 | (assets,positions,margin) = clearingHouse.getAccountAndMargin(account,subaccount)
(r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L606 | margin -= ClearingHouseLib.realizeFundingPayment(assets,positions)
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L619 | (cache.assets,cache.positions,cache.margin,cache.positionIdx) = _setupAccountAndValidateLiquidation({clearingHouse:clearingHouse,account:account,subaccount:subaccount,asset:asset,bookType:bookType})
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L639 | proratedMargin = clearingHouse.getProratedMargin(cache.assets,cache.positions,asset,cache.margin)
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L641 | cache.maintenanceOrProratedMargin = proratedMargin.toUint256()
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L653 | cache.maintenanceOrProratedMargin = clearingHouse.market[asset].getMaintenanceMargin(cache.positions[cache.positionIdx].amount)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertLiquidatable | 🎯🟩#L758 | ! self.isLiquidatable(assets,positions,margin,bookType)
(r) 🔗 MarketLib.liquidate | 🎯#L174 | amount = _getLiquidationAmount(self,amount)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._getLiquidationAmount | 🎯🟩#L571 | positionAmount.fullMulDiv(self.markPrice,1e18) < StorageLib.loadMarketSettings(self.asset).partialLiquidationThreshold
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel.backstopLiquidate(bytes32,address,uint256).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r*) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L241 | cache = _liquidate({clearingHouse:clearingHouse,asset:asset,account:account,subaccount:subaccount,bookType:BookType.BACKSTOP})
(r*) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L260 | fee = _settleBackstopLiquidation(clearingHouse,asset,proratedMargin.toUint256()).toInt256()
(r*) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L284 | StorageLib.loadCollateralManager().settleFill(account,subaccount,cache.margin,0)
(r*) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L286 | clearingHouse.updateAccount({account:account,subaccount:subaccount,assets:cache.assets,positions:cache.positions,tradedAsset:asset,positionIdx:cache.positionIdx,oiDelta:cache.positionResult.oiDelta,sideClose:cache.positionResult.sideClose})
(r*) 🔗 LiquidatorPanel._liquidate | 🎯#L629 | cache.fillResult = clearingHouse.market[asset].liquidate({account:account,subaccount:subaccount,side:cache.side,amount:cache.positions[cache.positionIdx].amount,bookType:bookType})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib.liquidate | 🎯#L176 | result = CLOBLib.placeOrder(account,PlaceOrderArgs({subaccount:subaccount,asset:self.asset,side:side,limitPrice:0,amount:amount,baseDenominated:true,tif:TiF.IOC,expiryTime:0,clientOrderId:0,reduceOnly:true}),bookType)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(r) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L249 | proratedMargin = cache.maintenanceOrProratedMargin.toInt256()
(r) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L268 | _emitLiquidationEvent({asset:asset,account:account,subaccount:subaccount,side:cache.side,quoteTraded:cache.fillResult.quoteTraded,baseTraded:cache.fillResult.baseTraded,rpnl:cache.positionResult.rpnl,margin:cache.margin,fee:fee,liquidationType:LiquidationType.BACKSTOP_LIQUIDATEE})
(r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L600 | (assets,positions,margin) = clearingHouse.getAccountAndMargin(account,subaccount)
(r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L606 | margin -= ClearingHouseLib.realizeFundingPayment(assets,positions)
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L619 | (cache.assets,cache.positions,cache.margin,cache.positionIdx) = _setupAccountAndValidateLiquidation({clearingHouse:clearingHouse,account:account,subaccount:subaccount,asset:asset,bookType:bookType})
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L639 | proratedMargin = clearingHouse.getProratedMargin(cache.assets,cache.positions,asset,cache.margin)
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L641 | cache.maintenanceOrProratedMargin = proratedMargin.toUint256()
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L653 | cache.maintenanceOrProratedMargin = clearingHouse.market[asset].getMaintenanceMargin(cache.positions[cache.positionIdx].amount)
(r) 🔗 LiquidatorPanel._settleBackstopLiquidation | 🎯#L681 | points[i] = clearingHouse.liquidatorPoints[data[i].liquidator]
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertLiquidatable | 🎯🟩#L758 | ! self.isLiquidatable(assets,positions,margin,bookType)
(r) 🔗 MarketLib.liquidate | 🎯#L174 | amount = _getLiquidationAmount(self,amount)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._getLiquidationAmount | 🎯🟩#L571 | positionAmount.fullMulDiv(self.markPrice,1e18) < StorageLib.loadMarketSettings(self.asset).partialLiquidationThreshold
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel.deleverage(bytes32,DeleveragePair[]).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L404 | (cache.makerAssets,cache.makerPositions,cache.makerMargin) = clearingHouse.getAccountAndMargin(pair.maker.account,pair.maker.subaccount)
(r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L406 | (cache.takerAssets,cache.takerPositions,cache.takerMargin) = clearingHouse.getAccountAndMargin(pair.taker.account,pair.taker.subaccount)
(r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L436 | bankruptcyPrice = _getBankruptcyPrice({position:cache.makerPositions[makerPositionIdx],closeSize:cache.baseAmount,proratedMargin:clearingHouse.getProratedMargin(cache.makerAssets,cache.makerPositions,asset,cache.makerMargin)})
(r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L444 | cache.quoteAmount = cache.baseAmount.fullMulDiv(bankruptcyPrice,1e18)
(r) 🔗 LiquidatorPanel._deleverage | 🎯#L491 | (params.margin,result.marginDelta) = clearingHouse.rebalanceClose({assets:params.assets,positions:params.positions,margin:params.margin,marginDelta:0})
(r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L568 | ! clearingHouse.hasBadDebt(params.makerAssets,params.makerPositions,params.makerMargin)
(r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L573 | ! clearingHouse.isOpenMarginRequirementMet(params.takerAssets,params.takerPositions,params.takerMargin)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L529 | minOpenMargin += self.market[assets.getBytes32(i)].getMinOpenMargin(positions[i].amount)
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L530 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib.hasBadDebt | 🎯🟩#L544 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L348 | positionNotional = positionAmount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L350 | minOpenMargin = positionNotional.fullMulDiv(1e18,StorageLib.loadMarketSettings(self.asset).maxOpenLeverage)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel.delistClose(bytes32,Account[]).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r*) 🔗 LiquidatorPanel.delistClose | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L313 | _delistClose(clearingHouse,market,asset,accounts[i])
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(r) 🔗 LiquidatorPanel._delistClose | 🎯#L329 | (cache.assets,cache.positions,cache.margin) = clearingHouse.getAccountAndMargin(account.account,account.subaccount)
(r) 🔗 LiquidatorPanel._delistClose | 🎯#L340 | cache.quoteTraded = cache.baseTraded.fullMulDiv(market.markPrice,1e18)
(r) 🔗 LiquidatorPanel._delistClose | 🎯#L353 | (cache.margin,cache.positionResult.marginDelta) = clearingHouse.rebalanceClose({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel.delistClose(bytes32,Account[]).market | clearingHouse.market[asset]
(r*) 🔗 LiquidatorPanel.delistClose | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L313 | _delistClose(clearingHouse,market,asset,accounts[i])
(r) 🔗 LiquidatorPanel._delistClose | 🎯#L340 | cache.quoteTraded = cache.baseTraded.fullMulDiv(market.markPrice,1e18)

(storage) LiquidatorPanel._delistClose(ClearingHouse,Market,bytes32,Account).clearingHouse |
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r*) 🔗 LiquidatorPanel._delistClose | 🎯#L386 | clearingHouse.updateAccount({account:account.account,subaccount:account.subaccount,assets:cache.assets,positions:cache.positions,tradedAsset:asset,positionIdx:positionIdx,oiDelta:cache.positionResult.oiDelta,sideClose:true})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(r) 🔗 LiquidatorPanel._delistClose | 🎯#L329 | (cache.assets,cache.positions,cache.margin) = clearingHouse.getAccountAndMargin(account.account,account.subaccount)
(r) 🔗 LiquidatorPanel._delistClose | 🎯#L353 | (cache.margin,cache.positionResult.marginDelta) = clearingHouse.rebalanceClose({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel._delistClose(ClearingHouse,Market,bytes32,Account).market |
(r) 🔗 LiquidatorPanel._delistClose | 🎯#L340 | cache.quoteTraded = cache.baseTraded.fullMulDiv(market.markPrice,1e18)

(storage) LiquidatorPanel._deleveragePair(ClearingHouse,bytes32,DeleveragePair).clearingHouse |
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r*) 🔗 LiquidatorPanel._deleveragePair | 🎯#L446 | _deleverage(clearingHouse,__DeleverageParams__({account:pair.maker.account,subaccount:pair.maker.subaccount,asset:asset,assets:cache.makerAssets,positions:cache.makerPositions,positionIdx:makerPositionIdx,baseTraded:cache.baseAmount,quoteTraded:cache.quoteAmount,margin:cache.makerMargin,deleverageType:LiquidationType.DELEVERAGE_MAKER}))
(r*) 🔗 LiquidatorPanel._deleveragePair | 🎯#L462 | _deleverage(clearingHouse,__DeleverageParams__({account:pair.taker.account,subaccount:pair.taker.subaccount,asset:asset,assets:cache.takerAssets,positions:cache.takerPositions,positionIdx:takerPositionIdx,baseTraded:cache.baseAmount,quoteTraded:cache.quoteAmount,margin:cache.takerMargin,deleverageType:LiquidationType.DELEVERAGE_TAKER}))
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L404 | (cache.makerAssets,cache.makerPositions,cache.makerMargin) = clearingHouse.getAccountAndMargin(pair.maker.account,pair.maker.subaccount)
(r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L406 | (cache.takerAssets,cache.takerPositions,cache.takerMargin) = clearingHouse.getAccountAndMargin(pair.taker.account,pair.taker.subaccount)
(r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L417 | _validateDeleveragePair(clearingHouse,__DeleverageValidationParams__({asset:asset,makerAssets:cache.makerAssets,takerAssets:cache.takerAssets,makerPositions:cache.makerPositions,takerPositions:cache.takerPositions,makerPositionIdx:makerPositionIdx,takerPositionIdx:takerPositionIdx,makerMargin:cache.makerMargin,takerMargin:cache.takerMargin}))
(r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L436 | bankruptcyPrice = _getBankruptcyPrice({position:cache.makerPositions[makerPositionIdx],closeSize:cache.baseAmount,proratedMargin:clearingHouse.getProratedMargin(cache.makerAssets,cache.makerPositions,asset,cache.makerMargin)})
(r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L444 | cache.quoteAmount = cache.baseAmount.fullMulDiv(bankruptcyPrice,1e18)
(r) 🔗 LiquidatorPanel._deleverage | 🎯#L491 | (params.margin,result.marginDelta) = clearingHouse.rebalanceClose({assets:params.assets,positions:params.positions,margin:params.margin,marginDelta:0})
(r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L568 | ! clearingHouse.hasBadDebt(params.makerAssets,params.makerPositions,params.makerMargin)
(r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L573 | ! clearingHouse.isOpenMarginRequirementMet(params.takerAssets,params.takerPositions,params.takerMargin)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L529 | minOpenMargin += self.market[assets.getBytes32(i)].getMinOpenMargin(positions[i].amount)
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L530 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib.hasBadDebt | 🎯🟩#L544 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L348 | positionNotional = positionAmount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L350 | minOpenMargin = positionNotional.fullMulDiv(1e18,StorageLib.loadMarketSettings(self.asset).maxOpenLeverage)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel._deleverage(ClearingHouse,LiquidatorPanel.__DeleverageParams__).clearingHouse |
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r*) 🔗 LiquidatorPanel._deleverage | 🎯#L528 | clearingHouse.updateAccount({account:params.account,subaccount:params.subaccount,assets:params.assets,positions:params.positions,tradedAsset:params.asset,positionIdx:params.positionIdx,oiDelta:result.oiDelta,sideClose:result.sideClose})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(r) 🔗 LiquidatorPanel._deleverage | 🎯#L491 | (params.margin,result.marginDelta) = clearingHouse.rebalanceClose({assets:params.assets,positions:params.positions,margin:params.margin,marginDelta:0})
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel._validateDeleveragePair(ClearingHouse,LiquidatorPanel.__DeleverageValidationParams__).clearingHouse |
(r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L568 | ! clearingHouse.hasBadDebt(params.makerAssets,params.makerPositions,params.makerMargin)
(r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L573 | ! clearingHouse.isOpenMarginRequirementMet(params.takerAssets,params.takerPositions,params.takerMargin)
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L529 | minOpenMargin += self.market[assets.getBytes32(i)].getMinOpenMargin(positions[i].amount)
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L530 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib.hasBadDebt | 🎯🟩#L544 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L348 | positionNotional = positionAmount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L350 | minOpenMargin = positionNotional.fullMulDiv(1e18,StorageLib.loadMarketSettings(self.asset).maxOpenLeverage)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)

(storage) LiquidatorPanel._setupAccountAndValidateLiquidation(ClearingHouse,address,uint256,bytes32,BookType).clearingHouse |
(r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L600 | (assets,positions,margin) = clearingHouse.getAccountAndMargin(account,subaccount)
(r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L606 | margin -= ClearingHouseLib.realizeFundingPayment(assets,positions)
(r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L608 | clearingHouse.assertLiquidatable(assets,positions,margin,bookType)
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertLiquidatable | 🎯🟩#L758 | ! self.isLiquidatable(assets,positions,margin,bookType)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel._liquidate(ClearingHouse,bytes32,address,uint256,BookType).clearingHouse |
(r*) 🔗 LiquidatorPanel._liquidate | 🎯#L629 | cache.fillResult = clearingHouse.market[asset].liquidate({account:account,subaccount:subaccount,side:cache.side,amount:cache.positions[cache.positionIdx].amount,bookType:bookType})
(r*) 🔗 MarketLib.liquidate | 🎯#L176 | result = CLOBLib.placeOrder(account,PlaceOrderArgs({subaccount:subaccount,asset:self.asset,side:side,limitPrice:0,amount:amount,baseDenominated:true,tif:TiF.IOC,expiryTime:0,clientOrderId:0,reduceOnly:true}),bookType)
(r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L600 | (assets,positions,margin) = clearingHouse.getAccountAndMargin(account,subaccount)
(r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L606 | margin -= ClearingHouseLib.realizeFundingPayment(assets,positions)
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L619 | (cache.assets,cache.positions,cache.margin,cache.positionIdx) = _setupAccountAndValidateLiquidation({clearingHouse:clearingHouse,account:account,subaccount:subaccount,asset:asset,bookType:bookType})
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L639 | proratedMargin = clearingHouse.getProratedMargin(cache.assets,cache.positions,asset,cache.margin)
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L641 | cache.maintenanceOrProratedMargin = proratedMargin.toUint256()
(r) 🔗 LiquidatorPanel._liquidate | 🎯#L653 | cache.maintenanceOrProratedMargin = clearingHouse.market[asset].getMaintenanceMargin(cache.positions[cache.positionIdx].amount)
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertLiquidatable | 🎯🟩#L758 | ! self.isLiquidatable(assets,positions,margin,bookType)
(r) 🔗 MarketLib.liquidate | 🎯#L174 | amount = _getLiquidationAmount(self,amount)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._getLiquidationAmount | 🎯🟩#L571 | positionAmount.fullMulDiv(self.markPrice,1e18) < StorageLib.loadMarketSettings(self.asset).partialLiquidationThreshold
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel._settleBackstopLiquidation(ClearingHouse,bytes32,uint256).clearingHouse |
(r) 🔗 LiquidatorPanel._settleBackstopLiquidation | 🎯#L681 | points[i] = clearingHouse.liquidatorPoints[data[i].liquidator]

(storage) AdminPanel.initialize(address,uint16[],uint16[]).feeManager | StorageLib.loadFeeManager()
(w) 🔗 AdminPanel.initialize | 🎯💥 ['initializer']#L124 | feeManager = StorageLib.loadFeeManager()
(w) 🔗 FeeManagerLib.setTakerFeeRates | 🎯#L28 | self.takerFeeRates = PackedFeeRatesLib.packFeeRates(takerFeeRates)
(w) 🔗 FeeManagerLib.setMakerFeeRates | 🎯#L32 | self.makerFeeRates = PackedFeeRatesLib.packFeeRates(makerFeeRates)
(r*) 🔗 AdminPanel.initialize | 🎯💥 ['initializer']#L134 | feeManager.setTakerFeeRates(takerFees)
(r*) 🔗 AdminPanel.initialize | 🎯💥 ['initializer']#L135 | feeManager.setMakerFeeRates(makerFees)

(storage) AdminPanel.createMarket(bytes32,MarketParams).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.createMarket | 🎯💥❌ ['onlyAdmin']#L146 | market = StorageLib.loadMarket(asset)
(w) 🔗 MarketLib.init | 🎯#L106 | self.asset = asset
(w) 🔗 MarketLib.init | 🎯#L107 | self.markPrice = initialPrice
(r*) 🔗 AdminPanel.createMarket | 🎯💥❌ ['onlyAdmin']#L191 | market.init({asset:asset,marketSettings:marketSettings,fundingSettings:fundingSettings,initialPrice:params.initialPrice})
    (🔀?self.asset?)  (w) 🔗 CLOBLib.init | 🎯#L120 | ds.config.asset = asset
    (🔀?self.asset?)  (w) 🔗 CLOBLib.init | 🎯#L126 | ds.config.asset = asset

(storage) AdminPanel.setMarkPrice(bytes32,uint256).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setMarkPrice | 🎯💥❌ ['onlyAdmin']#L210 | market = StorageLib.loadMarket(asset)
(w) 🔗 MarketLib.setMarkPrice | 🎯#L231 | self.markPrice = markPrice = _getMedian(p1,p2,p3)
(w) 🔗 PriceHistoryLib.snapshot | 🎯#L30 | history.snapshots[length - 1].price = price
(w) 🔗 PriceHistoryLib.snapshot | 🎯#L32 | history.snapshots.push(PriceSnapshot(price,0,block.timestamp))
(w) 🔗 PriceHistoryLib.snapshotBasisSpread | 🎯#L37 | history.snapshots.push(PriceSnapshot(0,basisSpread,0))
(r*) 🔗 AdminPanel.setMarkPrice | 🎯💥❌ ['onlyAdmin']#L214 | market.setMarkPrice(indexPrice)
(r*) 🔗 MarketLib.setMarkPrice | 🎯#L225 | _cacheImpactPrice(self)
(r*) 🔗 MarketLib.setMarkPrice | 🎯#L233 | metadata.markPriceHistory.snapshot(markPrice)
(r*) 🔗 MarketLib.setMarkPrice | 🎯#L234 | metadata.indexPriceHistory.snapshot(indexPrice)
(r*) 🔗 MarketLib._cacheBasisSpread | 🎯#L625 | StorageLib.loadMarketMetadata(self.asset).basisSpreadHistory.snapshotBasisSpread(basisSpread)
(r*) 🔗 MarketLib._cacheImpactPrice | 🎯#L635 | StorageLib.loadMarketMetadata(self.asset).impactPriceHistory.snapshot(impactPrice)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L217 | bestAsk = self.getBestAsk()
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L222 | bestAsk == type()(uint256).max
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L224 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.askLimits[bestAsk],bestAsk,quoteAmount)
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L226 | baseAmount += baseFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L227 | quoteUsed += quoteFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L228 | quoteAmount -= quoteFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L229 | bestAsk = self.getNextBiggestPrice(bestAsk,Side.SELL)
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L259 | bestBid = self.getBestBid()
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L266 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.bidLimits[bestBid],bestBid,quoteAmount)
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L268 | baseAmount += baseFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L269 | quoteUsed += quoteFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L270 | quoteAmount -= quoteFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L271 | bestBid = self.getNextSmallestPrice(bestBid,Side.BUY)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L484 | numOrders = limit.numOrders
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L485 | orderId = limit.headOrder
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L490 | orderId.unwrap() == 0
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L492 | fillAmount = self.orders[orderId].amount.min(quoteAmount.fullMulDiv(1e18,price))
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L494 | baseAmount += fillAmount
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L495 | quoteUsed += fillAmount.fullMulDiv(price,1e18)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L496 | quoteAmount -= fillAmount.fullMulDiv(price,1e18)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L498 | orderId = self.orders[orderId].nextOrderId
(r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(r) 🔗 MarketLib.setMarkPrice | 🎯#L222 | metadata = StorageLib.loadMarketMetadata(self.asset)
(r) 🔗 MarketLib.setMarkPrice | 🎯#L227 | p1 = self.getFundingRateComponent(indexPrice)
(r) 🔗 MarketLib.setMarkPrice | 🎯#L228 | p2 = (indexPrice.toInt256() + self.getBasisSpreadEMA()).toUint256()
(r) 🔗 MarketLib.setMarkPrice | 🎯#L229 | p3 = self.getImpactPriceTwap()
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L422 | (baseAmount,quoteUsed) = StorageLib.loadBook(self.asset).quoteBidInQuote(impactNotional)
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L424 | baseAmount += (impactNotional - quoteUsed).fullMulDiv(1e18,type()(uint256).max)
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L424 | impactNotional > quoteUsed
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L426 | impactBid = impactNotional.fullMulDiv(1e18,baseAmount)
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L428 | (baseAmount,quoteUsed) = StorageLib.loadBook(self.asset).quoteAskInQuote(impactNotional)
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L430 | baseAmount += (impactNotional - quoteUsed).fullMulDiv(1e18,1)
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L430 | impactNotional > quoteUsed
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L432 | impactAsk = impactNotional.fullMulDiv(1e18,baseAmount)
(r) 🔗 MarketLib.getMidPrice | 🎯🟩#L438 | asset = self.asset
(r) 🔗 MarketLib.getMidPrice | 🎯🟩#L440 | bestBid = StorageLib.loadBook(asset).getBestBid()
(r) 🔗 MarketLib.getMidPrice | 🎯🟩#L441 | bestAsk = StorageLib.loadBook(asset).getBestAsk()
(r) 🔗 MarketLib.getMidPrice | 🎯🟩#L443 | bestAsk == type()(uint256).max || bestBid == 0
(r) 🔗 MarketLib.getFundingRateComponent | 🎯🟩#L454 | fundingRateEngine = StorageLib.loadFundingRateEngine(asset)
(r) 🔗 MarketLib._cacheBasisSpread | 🎯#L619 | midPrice = self.getMidPrice()
(r) 🔗 MarketLib._cacheBasisSpread | 🎯#L623 | basisSpread = midPrice.toInt256() - indexPrice.toInt256()
(r) 🔗 MarketLib._cacheImpactPrice | 🎯#L630 | impactNotional = uint256(500e18).fullMulDiv(StorageLib.loadMarketSettings(self.asset).maxOpenLeverage,1e18)
(r) 🔗 MarketLib._cacheImpactPrice | 🎯#L633 | impactPrice = self.getImpactPrice(impactNotional)
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L103 | pWad = history.snapshots[i].basisSpread * 1e18
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L104 | _ema = (pWad * k + _ema * (1e18 - k)) / 1e18
(r) 🔗 PriceHistoryLib.snapshot | 🎯#L27 | length = history.snapshots.length
(r) 🔗 PriceHistoryLib.snapshot | 🎯#L29 | length > 0 && history.snapshots[length - 1].timestamp == block.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L53 | idx = history.snapshots.length
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L57 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L62 | timePeriod = block.timestamp - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L63 | elapsedTime = timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L64 | weightedPrice = currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L65 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L67 | currentSnapshot.timestamp > targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L71 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L73 | currentSnapshot.timestamp < targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L75 | elapsedTime += timePeriod = previousTime - targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L77 | elapsedTime += timePeriod = previousTime - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L80 | weightedPrice += currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L81 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L89 | n = history.snapshots.length
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L90 | n == 0 || period == 0
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L94 | start = n - count
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L99 | _ema = history.snapshots[start].basisSpread * 1e18
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) AdminPanel.settleFunding(bytes32).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.settleFunding | 🎯💥❌ ['onlyAdmin']#L218 | market = StorageLib.loadMarket(asset)
(w) 🔗 FundingLib._calcFundingIndex | 🎯#L113 | self.resetIterationsLeft = settings.resetIterations
(w) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | -- self.resetIterationsLeft
(w) 🔗 FundingLib.settleFunding | 🎯#L51 | self.lastFundingTime = block.timestamp
(w) 🔗 FundingLib.settleFunding | 🎯#L62 | self.fundingRate = fundingRate
(r*) 🔗 FundingLib.settleFunding | 🎯#L54 | (fundingIndex,fundingRate) = _calcFundingIndex({self:self,settings:settings,markTwap:markTwap.toInt256(),indexTwap:indexTwap.toInt256()})
(r*) 🔗 MarketLib.settleFunding | 🎯#L206 | (funding,cumulativeFunding) = fundingRateEngine.settleFunding({asset:asset,markTwap:metadata.markPriceHistory.twap(interval),indexTwap:metadata.indexPriceHistory.twap(interval)})
(r) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | self.resetIterationsLeft > 0
(r) 🔗 FundingLib.settleFunding | 🎯#L61 | cumulativeFundingIndex = self.cumulativeFundingIndex += fundingIndex
(r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L88 | elapsedTime = self.getTimeSinceLastFunding()
(r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L89 | interval = self.getFundingInterval(asset)
(r) 🔗 MarketLib.settleFunding | 🎯#L199 | asset = self.asset
(r) 🔗 MarketLib.settleFunding | 🎯#L201 | fundingRateEngine = StorageLib.loadFundingRateEngine(asset)
(r) 🔗 MarketLib.settleFunding | 🎯#L202 | metadata = StorageLib.loadMarketMetadata(asset)
(r) 🔗 MarketLib.settleFunding | 🎯#L204 | interval = fundingRateEngine.getTimeSinceLastFunding()
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L53 | idx = history.snapshots.length
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L57 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L62 | timePeriod = block.timestamp - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L63 | elapsedTime = timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L64 | weightedPrice = currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L65 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L67 | currentSnapshot.timestamp > targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L71 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L73 | currentSnapshot.timestamp < targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L75 | elapsedTime += timePeriod = previousTime - targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L77 | elapsedTime += timePeriod = previousTime - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L80 | weightedPrice += currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L81 | previousTime = currentSnapshot.timestamp

(storage) AdminPanel.placeTwapOrder(address,PlaceOrderArgs,SignData).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 AdminPanel.placeTwapOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L277 | clearingHouse = StorageLib.loadClearingHouse()
(w) 🔗 AdminPanel.placeTwapOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L281 | clearingHouse.nonceUsed[account][signData.nonce] = true
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r*) 🔗 AdminPanel.placeTwapOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L283 | clearingHouse.placeOrder(account,args,BookType.STANDARD)
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L114 | orderResult = market.placeOrder(account,args,bookType)
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L124 | StorageLib.loadCollateralManager().handleCollateralDelta({account:account,collateralDelta:collateralPosted.toInt256()})
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L132 | _processTakerFill(self,__FillParams__({asset:args.asset,account:account,subaccount:args.subaccount,side:args.side,quoteAmount:orderResult.quoteTraded,baseAmount:orderResult.baseTraded,collateralPosted:collateralPosted}))
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(r) 🔗 AdminPanel.placeTwapOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L279 | _validateSig(clearingHouse,account,abi.encode(args),signData)
(r) 🔗 AdminPanel._validateSig | 🎯🟩#L707 | clearingHouse.nonceUsed[signer][signData.nonce]
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L112 | market = self.market[args.asset]
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L117 | orderResult.basePosted > 0 && ! args.reduceOnly
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L118 | collateralPosted = _getCollateral(orderResult.basePosted,args.limitPrice,market.getPositionLeverage(account,args.subaccount))
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L123 | orderResult.baseTraded == 0
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L312 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L318 | finalMarginDelta = marginDelta.min((intendedMargin.toInt256() - equity).max(0))
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L320 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L585 | cache.assets = self.assets[params.account][params.subaccount].values().wrap()
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L599 | cache.positions = _getPositions(self,cache.assets,params.account,params.subaccount,isNewPosition)
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L622 | (cache.margin,cache.positionResult.marginDelta) = self.rebalanceAccount({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertNotLiquidatable | 🎯🟩#L748 | self.isLiquidatable(assets,positions,margin,BookType.STANDARD)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) AdminPanel.placeTPSLOrder(address,PlaceOrderArgs,Condition,SignData).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 AdminPanel.placeTPSLOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L292 | clearingHouse = StorageLib.loadClearingHouse()
(w) 🔗 AdminPanel.placeTPSLOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L296 | clearingHouse.nonceUsed[account][signData.nonce] = true
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r*) 🔗 AdminPanel.placeTPSLOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L300 | clearingHouse.placeOrder(account,args,BookType.STANDARD)
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L114 | orderResult = market.placeOrder(account,args,bookType)
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L124 | StorageLib.loadCollateralManager().handleCollateralDelta({account:account,collateralDelta:collateralPosted.toInt256()})
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L132 | _processTakerFill(self,__FillParams__({asset:args.asset,account:account,subaccount:args.subaccount,side:args.side,quoteAmount:orderResult.quoteTraded,baseAmount:orderResult.baseTraded,collateralPosted:collateralPosted}))
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(r) 🔗 AdminPanel.placeTPSLOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L294 | _validateSig(clearingHouse,account,abi.encode(args,condition),signData)
(r) 🔗 AdminPanel.placeTPSLOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L298 | ! clearingHouse.market[args.asset].isTPSLConditionMet(args.side,condition)
(r) 🔗 AdminPanel._validateSig | 🎯🟩#L707 | clearingHouse.nonceUsed[signer][signData.nonce]
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L112 | market = self.market[args.asset]
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L117 | orderResult.basePosted > 0 && ! args.reduceOnly
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L118 | collateralPosted = _getCollateral(orderResult.basePosted,args.limitPrice,market.getPositionLeverage(account,args.subaccount))
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L123 | orderResult.baseTraded == 0
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L312 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L318 | finalMarginDelta = marginDelta.min((intendedMargin.toInt256() - equity).max(0))
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L320 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L585 | cache.assets = self.assets[params.account][params.subaccount].values().wrap()
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L599 | cache.positions = _getPositions(self,cache.assets,params.account,params.subaccount,isNewPosition)
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L622 | (cache.margin,cache.positionResult.marginDelta) = self.rebalanceAccount({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertNotLiquidatable | 🎯🟩#L748 | self.isLiquidatable(assets,positions,margin,BookType.STANDARD)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib.isTPSLConditionMet | 🎯🟩#L497 | mark = self.markPrice
(r) 🔗 MarketLib.isTPSLConditionMet | 🎯🟩#L500 | mark >= condition.triggerPrice
(r) 🔗 MarketLib.isTPSLConditionMet | 🎯🟩#L502 | mark <= condition.triggerPrice
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) AdminPanel.activateProtocol().clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 AdminPanel.activateProtocol | 🎯💥❌ ['onlyAdmin']#L320 | clearingHouse = StorageLib.loadClearingHouse()
    (🔀?clearingHouse.active?)  (w) 🔗 Launchpad._graduate | 🎯🟢🔴🌀#L315 | _launches[buyData.token].active = false

(storage) AdminPanel.deactivateProtocol().clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 AdminPanel.deactivateProtocol | 🎯💥❌ ['onlyAdmin']#L330 | clearingHouse = StorageLib.loadClearingHouse()
    (🔀?clearingHouse.active?)  (w) 🔗 Launchpad._graduate | 🎯🟢🔴🌀#L315 | _launches[buyData.token].active = false

(storage) AdminPanel.activateMarket(bytes32).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.activateMarket | 🎯💥❌ ['onlyAdmin']#L346 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.deactivateMarket(bytes32).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.deactivateMarket | 🎯💥❌ ['onlyAdmin']#L360 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.delistMarket(bytes32).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.delistMarket | 🎯💥❌ ['onlyAdmin']#L374 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.relistMarket(bytes32).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.relistMarket | 🎯💥❌ ['onlyAdmin']#L389 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.relistMarket(bytes32).marketMetadata | StorageLib.loadMarketMetadata(asset)
(w) 🔗 AdminPanel.relistMarket | 🎯💥❌ ['onlyAdmin']#L390 | marketMetadata = StorageLib.loadMarketMetadata(asset)
(r) 🔗 AdminPanel.relistMarket | 🎯💥❌ ['onlyAdmin']#L402 | marketMetadata.longOI + marketMetadata.shortOI > 0

(storage) AdminPanel.relistMarket(bytes32).book | StorageLib.loadBook(asset)
(w) 🔗 AdminPanel.relistMarket | 🎯💥❌ ['onlyAdmin']#L391 | book = StorageLib.loadBook(asset)
(r) 🔗 AdminPanel.relistMarket | 🎯💥❌ ['onlyAdmin']#L399 | book.metadata.baseOI + book.metadata.quoteOI > 0

(storage) AdminPanel.enableCrossMargin(bytes32).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.enableCrossMargin | 🎯💥❌ ['onlyAdmin']#L410 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.disableCrossMargin(bytes32).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.disableCrossMargin | 🎯💥❌ ['onlyAdmin']#L422 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setMaxLeverage(bytes32,uint256).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setMaxLeverage | 🎯💥❌ ['onlyAdmin']#L438 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setMinMarginRatio(bytes32,uint256).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setMinMarginRatio | 🎯💥❌ ['onlyAdmin']#L448 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setMinMarginRatio(bytes32,uint256).settings | StorageLib.loadMarketSettings(asset)
(w) 🔗 AdminPanel.setMinMarginRatio | 🎯💥❌ ['onlyAdmin']#L449 | settings = StorageLib.loadMarketSettings(asset)
(w) 🔗 AdminPanel.setMinMarginRatio | 🎯💥❌ ['onlyAdmin']#L455 | settings.maintenanceMarginRatio = maintenanceMarginRatio
(r) 🔗 AdminPanel.setMinMarginRatio | 🎯💥❌ ['onlyAdmin']#L453 | _validateMaintenanceMarginRatio(maintenanceMarginRatio,settings.maxOpenLeverage)

(storage) AdminPanel.setLiquidationFeeRate(bytes32,uint256).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setLiquidationFeeRate | 🎯💥❌ ['onlyAdmin']#L464 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setDivergenceCap(bytes32,uint256).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setDivergenceCap | 🎯💥❌ ['onlyAdmin']#L478 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setReduceOnlyCap(bytes32,uint256).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setReduceOnlyCap | 🎯💥❌ ['onlyAdmin']#L489 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setPartialLiquidationThreshold(bytes32,uint256).market | StorageLib.loadMarket(asset)
(storage) AdminPanel.setPartialLiquidationRate(bytes32,uint256).market | StorageLib.loadMarket(asset)
(storage) AdminPanel.setFundingInterval(bytes32,uint256,uint256).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setFundingInterval | 🎯💥❌ ['onlyAdmin']#L530 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setFundingInterval(bytes32,uint256,uint256).settings | StorageLib.loadFundingRateSettings(asset)
(w) 🔗 AdminPanel.setFundingInterval | 🎯💥❌ ['onlyAdmin']#L534 | settings = StorageLib.loadFundingRateSettings(asset)
(w) 🔗 AdminPanel.setFundingInterval | 🎯💥❌ ['onlyAdmin']#L538 | settings.fundingInterval = fundingInterval
(w) 🔗 AdminPanel.setFundingInterval | 🎯💥❌ ['onlyAdmin']#L539 | settings.resetInterval = resetInterval

(storage) AdminPanel.setResetIterations(bytes32,uint256).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setResetIterations | 🎯💥❌ ['onlyAdmin']#L547 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setFundingClamps(bytes32,uint256,uint256).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setFundingClamps | 🎯💥❌ ['onlyAdmin']#L558 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setFundingClamps(bytes32,uint256,uint256).settings | StorageLib.loadFundingRateSettings(asset)
(w) 🔗 AdminPanel.setFundingClamps | 🎯💥❌ ['onlyAdmin']#L562 | settings = StorageLib.loadFundingRateSettings(asset)
(w) 🔗 AdminPanel.setFundingClamps | 🎯💥❌ ['onlyAdmin']#L564 | settings.innerClamp = innerClamp
(w) 🔗 AdminPanel.setFundingClamps | 🎯💥❌ ['onlyAdmin']#L565 | settings.outerClamp = outerClamp

(storage) AdminPanel.setInterestRate(bytes32,int256).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setInterestRate | 🎯💥❌ ['onlyAdmin']#L573 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setMaxNumOrders(bytes32,uint256).book | StorageLib.loadBook(asset)
(w) 🔗 AdminPanel.setMaxNumOrders | 🎯💥❌ ['onlyAdmin']#L585 | book = StorageLib.loadBook(asset)

(storage) AdminPanel.setMaxLimitsPerTx(bytes32,uint8).book | StorageLib.loadBook(asset)
(w) 🔗 AdminPanel.setMaxLimitsPerTx | 🎯💥❌ ['onlyAdmin']#L597 | book = StorageLib.loadBook(asset)

(storage) AdminPanel.setMinLimitOrderAmountInBase(bytes32,uint256).book | StorageLib.loadBook(asset)
(r) 🔗 AdminPanel.setMinLimitOrderAmountInBase | 🎯💥❌ ['onlyAdmin']#L611 | _validateConform(minLimitOrderAmountInBase,book.config.lotSize)

(storage) AdminPanel.setTickSize(bytes32,uint256).book | StorageLib.loadBook(asset)
(w) 🔗 AdminPanel.setTickSize | 🎯💥❌ ['onlyAdmin']#L619 | book = StorageLib.loadBook(asset)
(r) 🔗 AdminPanel.setTickSize | 🎯💥❌ ['onlyAdmin']#L624 | _validateMinBookValue(book.config.lotSize,tickSize)

(storage) AdminPanel.setMarketSettings(bytes32,MarketSettings).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setMarketSettings | 🎯💥❌ ['onlyAdmin']#L632 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setMarketSettings(bytes32,MarketSettings).marketSettings | StorageLib.loadMarketSettings(asset)
(w) 🔗 AdminPanel.setMarketSettings | 🎯💥❌ ['onlyAdmin']#L633 | marketSettings = StorageLib.loadMarketSettings(asset)
(w) 🔗 MarketLib.init | 🎯#L115 | settings.status = initSettings.status
(w) 🔗 MarketLib.init | 🎯#L116 | settings.crossMarginEnabled = initSettings.crossMarginEnabled
(w) 🔗 MarketLib.init | 🎯#L117 | settings.maxOpenLeverage = initSettings.maxOpenLeverage
(w) 🔗 MarketLib.init | 🎯#L118 | settings.maintenanceMarginRatio = initSettings.maintenanceMarginRatio
(w) 🔗 MarketLib.init | 🎯#L119 | settings.liquidationFeeRate = initSettings.liquidationFeeRate
(w) 🔗 MarketLib.init | 🎯#L120 | settings.divergenceCap = initSettings.divergenceCap
(w) 🔗 MarketLib.init | 🎯#L121 | settings.reduceOnlyCap = initSettings.reduceOnlyCap
(w) 🔗 MarketLib.init | 🎯#L122 | settings.partialLiquidationThreshold = initSettings.partialLiquidationThreshold
(w) 🔗 MarketLib.init | 🎯#L123 | settings.partialLiquidationRate = initSettings.partialLiquidationRate
(r) 🔗 AdminPanel.setMarketSettings | 🎯💥❌ ['onlyAdmin']#L637 | marketSettings.status != settings.status
    (🔀?settings.status?)  (w) 🔗 CLOBStorageLib.init | 🎯#L543 | ss.status = marketSettings.status
    (🔀?settings.status?)  (w) 🔗 CLOBStorageLib.init | 🎯#L543 | ss.status = marketSettings.status

(storage) AdminPanel.setFundingRateSettings(bytes32,FundingRateSettings).market | StorageLib.loadMarket(asset)
(w) 🔗 AdminPanel.setFundingRateSettings | 🎯💥❌ ['onlyAdmin']#L661 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setBookSettings(bytes32,BookSettings).bookSettings | StorageLib.loadBookSettings(asset)
(w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L684 | bookSettings = StorageLib.loadBookSettings(asset)
(w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L686 | bookSettings.maxNumOrders = settings.maxNumOrders
(w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L687 | bookSettings.maxLimitsPerTx = settings.maxLimitsPerTx
(w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L688 | bookSettings.minLimitOrderAmountInBase = settings.minLimitOrderAmountInBase
(w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L689 | bookSettings.tickSize = settings.tickSize
    (🔀?bookSettings.maxNumOrders?)  (w) 🔗 CLOBLib.init | 🎯#L115 | dsSettings.maxNumOrders = bookSettings.maxNumOrders
    (🔀?bookSettings.maxLimitsPerTx?)  (w) 🔗 CLOBStorageLib.init | 🎯#L544 | ss.maxLimitsPerTx = marketSettings.maxLimitsPerTx
    (🔀?bookSettings.maxLimitsPerTx?)  (w) 🔗 CLOBStorageLib.init | 🎯#L544 | ss.maxLimitsPerTx = marketSettings.maxLimitsPerTx
    (🔀?bookSettings.maxLimitsPerTx?)  (w) 🔗 CLOBLib.init | 🎯#L116 | dsSettings.maxLimitsPerTx = bookSettings.maxLimitsPerTx
    (🔀?bookSettings.minLimitOrderAmountInBase?)  (w) 🔗 CLOBStorageLib.init | 🎯#L545 | ss.minLimitOrderAmountInBase = marketSettings.minLimitOrderAmountInBase
    (🔀?bookSettings.minLimitOrderAmountInBase?)  (w) 🔗 CLOBStorageLib.init | 🎯#L545 | ss.minLimitOrderAmountInBase = marketSettings.minLimitOrderAmountInBase
    (🔀?bookSettings.minLimitOrderAmountInBase?)  (w) 🔗 CLOBLib.init | 🎯#L117 | dsSettings.minLimitOrderAmountInBase = bookSettings.minLimitOrderAmountInBase
    (🔀?bookSettings.tickSize?)  (w) 🔗 CLOBStorageLib.init | 🎯#L546 | ss.tickSize = marketSettings.tickSize
    (🔀?bookSettings.tickSize?)  (w) 🔗 CLOBStorageLib.init | 🎯#L546 | ss.tickSize = marketSettings.tickSize
    (🔀?bookSettings.tickSize?)  (w) 🔗 CLOBLib.init | 🎯#L118 | dsSettings.tickSize = bookSettings.tickSize

(storage) AdminPanel._validateSig(ClearingHouse,address,bytes,SignData).clearingHouse |
(r) 🔗 AdminPanel._validateSig | 🎯🟩#L707 | clearingHouse.nonceUsed[signer][signData.nonce]

(storage) PerpManager.addMargin(address,uint256,uint256).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(i) (r*) 🔗 PerpManager.addMargin | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L165 | clearingHouse.setPositions({tradedAsset:,account:account,subaccount:subaccount,assets:cache.assets,positions:cache.positions})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(i) (r) 🔗 PerpManager.addMargin | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L145 | (cache.assets,cache.positions) = clearingHouse.getAccount(account,subaccount)
(i) (r) 🔗 PerpManager.addMargin | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L162 | clearingHouse.assertNotLiquidatable({assets:cache.assets,positions:cache.positions,margin:remainingMargin})
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertNotLiquidatable | 🎯🟩#L748 | self.isLiquidatable(assets,positions,margin,BookType.STANDARD)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) PerpManager.removeMargin(address,uint256,uint256).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(i) (r*) 🔗 PerpManager.removeMargin | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L210 | clearingHouse.setPositions({tradedAsset:,account:account,subaccount:subaccount,assets:cache.assets,positions:cache.positions})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(i) (r) 🔗 PerpManager.removeMargin | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L185 | (cache.assets,cache.positions) = clearingHouse.getAccount(account,subaccount)
(i) (r) 🔗 PerpManager.removeMargin | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L203 | clearingHouse.assertPostWithdrawalMarginRequired({assets:cache.assets,positions:cache.positions,margin:remainingMargin})
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getNotionalAccountValue | 🎯🟩#L469 | totalNotional += self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertPostWithdrawalMarginRequired | 🎯🟩#L769 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.assertPostWithdrawalMarginRequired | 🎯🟩#L770 | totalNotional = self.getNotionalAccountValue(assets,positions)
(r) 🔗 ClearingHouseLib.assertPostWithdrawalMarginRequired | 🎯🟩#L772 | intendedMargin = intendedMargin.max(totalNotional / 10)
(r) 🔗 ClearingHouseLib.assertPostWithdrawalMarginRequired | 🎯🟩#L774 | margin + upnl < intendedMargin.toInt256()
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) PerpManager.setPositionLeverage(bytes32,address,uint256,uint256).clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 PerpManager.setPositionLeverage | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L244 | market.position[account][subaccount].leverage = newLeverage
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(i) (r*) 🔗 PerpManager.setPositionLeverage | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L278 | clearingHouse.setPositions({tradedAsset:,account:account,subaccount:subaccount,assets:cache.assets,positions:cache.positions})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(i) (r) 🔗 PerpManager.setPositionLeverage | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L235 | cache.currentLeverage = market.getPositionLeverage(account,subaccount)
(i) (r) 🔗 PerpManager.setPositionLeverage | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L236 | cache.orderbookNotional = market.orderbookNotional[account][subaccount]
(i) (r) 🔗 PerpManager.setPositionLeverage | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L264 | (cache.assets,cache.positions) = clearingHouse.getAccount(account,subaccount)
(i) (r) 🔗 PerpManager.setPositionLeverage | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L269 | cache.newMargin = clearingHouse.getIntendedMargin(cache.assets,cache.positions)
(i) (r) 🔗 PerpManager.setPositionLeverage | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L272 | clearingHouse.assertOpenMarginRequired({assets:cache.assets,positions:cache.positions,margin:cache.newMargin.toInt256()})
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getIntendedMargin | 🎯🟩#L422 | intendedMargin += self.market[assets.getBytes32(i)].getIntendedMargin(positions[i])
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L529 | minOpenMargin += self.market[assets.getBytes32(i)].getMinOpenMargin(positions[i].amount)
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L530 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertOpenMarginRequired | 🎯🟩#L784 | ! self.isOpenMarginRequirementMet(assets,positions,margin)
(r) 🔗 MarketLib.getIntendedMargin | 🎯🟩#L338 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMargin | 🎯🟩#L340 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L348 | positionNotional = positionAmount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L350 | minOpenMargin = positionNotional.fullMulDiv(1e18,StorageLib.loadMarketSettings(self.asset).maxOpenLeverage)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) PerpManager.setPositionLeverage(bytes32,address,uint256,uint256).market | clearingHouse.market[asset]
(i) (w) 🔗 PerpManager.setPositionLeverage | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L244 | market.position[account][subaccount].leverage = newLeverage
(i) (r) 🔗 PerpManager.setPositionLeverage | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L235 | cache.currentLeverage = market.getPositionLeverage(account,subaccount)
(i) (r) 🔗 PerpManager.setPositionLeverage | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)']#L236 | cache.orderbookNotional = market.orderbookNotional[account][subaccount]
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage

(storage) PerpManager.amendLimitOrder(address,AmendLimitOrderArgs).clearingHouse | StorageLib.loadClearingHouse()
(i) (r*) 🔗 PerpManager.amendLimitOrder | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)', 'onlyActiveProtocol']#L336 | collateralDelta = clearingHouse.market[args.asset].amendLimitOrder(account,args,BookType.STANDARD)
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong

(storage) PerpManager.amendLimitOrderBackstop(address,AmendLimitOrderArgs).clearingHouse | StorageLib.loadClearingHouse()
(i) (r*) 🔗 PerpManager.amendLimitOrderBackstop | 🎯💥❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)', 'onlyActiveProtocol']#L360 | collateralDelta = clearingHouse.market[args.asset].amendLimitOrder(account,args,BookType.BACKSTOP)
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong

(storage) PerpManager.cancelConditionalOrders(address,uint256[]).clearingHouse | StorageLib.loadClearingHouse()

Solidity Vars Used

msg.sender
msg.sender @ 🔗 OperatorPanel.onlySenderOrOperatorHub#73:13 | 🎯🌈🟢 | msg.sender != account && msg.sender != operatorHub
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 Launchpad.onlySenderOrOperator#144:13 | 🎯🌈🟢 | msg.sender != gteRouter
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 GTERouter.launchpadSell#188:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.sell({account:msg.sender,token:launchToken,recipient:msg.sender,amountInBase:amountInBase,minAmountOutQuote:worstAmountOutQuote})
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 OperatorHub.approveOperatorSpot#28:9 | 🎯💥🟢🌀 | accountManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OperatorHub.approveOperatorPerps#32:9 | 🎯💥🟢🌀 | perpManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OperatorHub.disapproveOperatorSpot#36:9 | 🎯💥🟢🌀 | accountManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OperatorHub.disapproveOperatorPerps#40:9 | 🎯💥🟢🌀 | perpManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 AccountManager.withdrawToPerps#221:13 | 🎯💥🟢🌀 | msg.sender != address(perpManager)
msg.sender @ 🔗 PerpManager.depositTo#112:9 | 🎯💥 | StorageLib.loadCollateralManager().depositFreeCollateral({from:msg.sender,to:account,amount:amount})
msg.sender @ 🔗 PerpManager.withdrawToSpot#128:13 | 🎯💥🟢 | msg.sender != address(accountManager)
msg.sender @ 🔗 GTL.onlyPerpManager#52:13 | 🎯🌈🟢 | msg.sender != perpManager
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#22:13 | 🎯🟩🌀 | msg.sender == account || msg.sender == gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#24:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#33:13 | 🎯🟩🌀 | msg.sender == account
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#35:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#57:13 | 🎯🟩 | msg.sender == account
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#59:9 | 🎯🟩 | rolesPacked = self.operatorRoleApprovals[account][msg.sender]
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

this
this @ 🔗 Initializable.initializer#71:17 | 🌈🟢 | ! extcodesize(uint256)(address()()) < i_initializer_asm_0 >> 1 == 1
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 Launchpad.sell#359:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amountInBase)
this @ 🔗 CollateralManagerLib.depositFreeCollateral#36:9 | 🎯🟢 | USDC.safeTransferFrom(from,address(this),amount)
this @ 🔗 GTL.approveOperator#170:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).approveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})
this @ 🔗 GTL.disapproveOperator#178:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).disapproveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])
this @ 🔗 GTL.orderbookCollateral#219:13 | 🎯💥🟢🟩🌀 | collateral += IViewPort(perpManager).getOrderbookCollateral(address(this),subaccounts[i])
this @ 🔗 GTL.freeCollateralBalance#224:9 | 🎯💥🟢🟩🌀 | IViewPort(perpManager).getFreeCollateralBalance(address(this))

block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 OrderLib.isExpired#92:9 | 🎯🟩 | self.expiryTime != NULL_TIMESTAMP && self.expiryTime < block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#97:9 | 🎯🟩 | expiryTime != NULL_TIMESTAMP && expiryTime < block.timestamp
block.timestamp @ 🔗 PriceHistoryLib.snapshot#29:13 | 🎯 | length > 0 && history.snapshots[length - 1].timestamp == block.timestamp
block.timestamp @ 🔗 PriceHistoryLib.snapshot#32:13 | 🎯 | history.snapshots.push(PriceSnapshot(price,0,block.timestamp))
block.timestamp @ 🔗 PriceHistoryLib.twap#61:9 | 🎯🟩 | targetTime = block.timestamp - twapInterval
block.timestamp @ 🔗 PriceHistoryLib.twap#62:9 | 🎯🟩 | timePeriod = block.timestamp - currentSnapshot.timestamp
block.timestamp @ 🔗 MarketLib.init#111:9 | 🎯 | StorageLib.loadFundingRateEngine(asset).lastFundingTime = block.timestamp
block.timestamp @ 🔗 AdminPanel._validateSig#708:13 | 🎯🟩 | signData.expiry < block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 MarketLib.getFundingRateComponent#456:9 | 🎯🟩 | indexPrice.fullMulDiv(1e18 + fundingRateEngine.fundingRate.abs().fullMulDiv(block.timestamp - fundingRateEngine.lastFundingTime,fundingRateEngine.getFundingInterval(asset)),1e18)
block.timestamp @ 🔗 FundingLib.settleFunding#51:9 | 🎯 | self.lastFundingTime = block.timestamp
block.timestamp @ 🔗 FundingLib.getTimeSinceLastFunding#80:9 | 🎯🟩 | block.timestamp - self.lastFundingTime
block.timestamp @ 🔗 AdminPanel._validateSig#708:13 | 🎯🟩 | signData.expiry < block.timestamp

self.balance
self.balance @ 🔗 InsuranceFundLib.withdraw#44:13 | 🎯 | self.balance < amount
self.balance @ 🔗 InsuranceFundLib.claim#35:13 | 🎯 | self.balance < amount

External Calls

PerpManager.depositFromSpot | 🎯💥🟢🌀❌ ['onlySenderOrOperator(address,PerpsOperatorRoles)'] | accountManager.withdrawToPerps(account, amount)


modifiers_html

functions_html

IPerpManager,/home/ubuntu/2025-08-gte-perps/contracts/perps/interfaces/IPerpManager.sol#6:1

state_vars_html


Solidity Vars Used

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])
this @ 🔗 GTL.orderbookCollateral#219:13 | 🎯💥🟢🟩🌀 | collateral += IViewPort(perpManager).getOrderbookCollateral(address(this),subaccounts[i])
this @ 🔗 GTL.freeCollateralBalance#224:9 | 🎯💥🟢🟩🌀 | IViewPort(perpManager).getFreeCollateralBalance(address(this))

modifiers_html

functions_html

AdminPanel,/home/ubuntu/2025-08-gte-perps/contracts/perps/modules/AdminPanel.sol#39:1

state_vars_html

(storage) AdminPanel.initialize(address,uint16[],uint16[]).feeManager | StorageLib.loadFeeManager()
(i) (w) 🔗 AdminPanel.initialize | 🎯💥 ['initializer']#L124 | feeManager = StorageLib.loadFeeManager()
(w) 🔗 FeeManagerLib.setTakerFeeRates | 🎯#L28 | self.takerFeeRates = PackedFeeRatesLib.packFeeRates(takerFeeRates)
(w) 🔗 FeeManagerLib.setMakerFeeRates | 🎯#L32 | self.makerFeeRates = PackedFeeRatesLib.packFeeRates(makerFeeRates)
(i) (r*) 🔗 AdminPanel.initialize | 🎯💥 ['initializer']#L134 | feeManager.setTakerFeeRates(takerFees)
(i) (r*) 🔗 AdminPanel.initialize | 🎯💥 ['initializer']#L135 | feeManager.setMakerFeeRates(makerFees)

(storage) AdminPanel.createMarket(bytes32,MarketParams).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.createMarket | 🎯💥❌ ['onlyAdmin']#L146 | market = StorageLib.loadMarket(asset)
(w) 🔗 MarketLib.init | 🎯#L106 | self.asset = asset
(w) 🔗 MarketLib.init | 🎯#L107 | self.markPrice = initialPrice
(i) (r*) 🔗 AdminPanel.createMarket | 🎯💥❌ ['onlyAdmin']#L191 | market.init({asset:asset,marketSettings:marketSettings,fundingSettings:fundingSettings,initialPrice:params.initialPrice})
    (🔀?self.asset?)  (w) 🔗 CLOBLib.init | 🎯#L120 | ds.config.asset = asset
    (🔀?self.asset?)  (w) 🔗 CLOBLib.init | 🎯#L126 | ds.config.asset = asset

(storage) AdminPanel.setMarkPrice(bytes32,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setMarkPrice | 🎯💥❌ ['onlyAdmin']#L210 | market = StorageLib.loadMarket(asset)
(w) 🔗 MarketLib.setMarkPrice | 🎯#L231 | self.markPrice = markPrice = _getMedian(p1,p2,p3)
(w) 🔗 PriceHistoryLib.snapshot | 🎯#L30 | history.snapshots[length - 1].price = price
(w) 🔗 PriceHistoryLib.snapshot | 🎯#L32 | history.snapshots.push(PriceSnapshot(price,0,block.timestamp))
(w) 🔗 PriceHistoryLib.snapshotBasisSpread | 🎯#L37 | history.snapshots.push(PriceSnapshot(0,basisSpread,0))
(i) (r*) 🔗 AdminPanel.setMarkPrice | 🎯💥❌ ['onlyAdmin']#L214 | market.setMarkPrice(indexPrice)
(r*) 🔗 MarketLib.setMarkPrice | 🎯#L225 | _cacheImpactPrice(self)
(r*) 🔗 MarketLib.setMarkPrice | 🎯#L233 | metadata.markPriceHistory.snapshot(markPrice)
(r*) 🔗 MarketLib.setMarkPrice | 🎯#L234 | metadata.indexPriceHistory.snapshot(indexPrice)
(r*) 🔗 MarketLib._cacheBasisSpread | 🎯#L625 | StorageLib.loadMarketMetadata(self.asset).basisSpreadHistory.snapshotBasisSpread(basisSpread)
(r*) 🔗 MarketLib._cacheImpactPrice | 🎯#L635 | StorageLib.loadMarketMetadata(self.asset).impactPriceHistory.snapshot(impactPrice)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L217 | bestAsk = self.getBestAsk()
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L222 | bestAsk == type()(uint256).max
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L224 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.askLimits[bestAsk],bestAsk,quoteAmount)
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L226 | baseAmount += baseFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L227 | quoteUsed += quoteFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L228 | quoteAmount -= quoteFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L229 | bestAsk = self.getNextBiggestPrice(bestAsk,Side.SELL)
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L259 | bestBid = self.getBestBid()
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L266 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.bidLimits[bestBid],bestBid,quoteAmount)
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L268 | baseAmount += baseFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L269 | quoteUsed += quoteFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L270 | quoteAmount -= quoteFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L271 | bestBid = self.getNextSmallestPrice(bestBid,Side.BUY)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L484 | numOrders = limit.numOrders
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L485 | orderId = limit.headOrder
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L490 | orderId.unwrap() == 0
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L492 | fillAmount = self.orders[orderId].amount.min(quoteAmount.fullMulDiv(1e18,price))
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L494 | baseAmount += fillAmount
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L495 | quoteUsed += fillAmount.fullMulDiv(price,1e18)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L496 | quoteAmount -= fillAmount.fullMulDiv(price,1e18)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L498 | orderId = self.orders[orderId].nextOrderId
(r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(r) 🔗 MarketLib.setMarkPrice | 🎯#L222 | metadata = StorageLib.loadMarketMetadata(self.asset)
(r) 🔗 MarketLib.setMarkPrice | 🎯#L227 | p1 = self.getFundingRateComponent(indexPrice)
(r) 🔗 MarketLib.setMarkPrice | 🎯#L228 | p2 = (indexPrice.toInt256() + self.getBasisSpreadEMA()).toUint256()
(r) 🔗 MarketLib.setMarkPrice | 🎯#L229 | p3 = self.getImpactPriceTwap()
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L422 | (baseAmount,quoteUsed) = StorageLib.loadBook(self.asset).quoteBidInQuote(impactNotional)
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L424 | baseAmount += (impactNotional - quoteUsed).fullMulDiv(1e18,type()(uint256).max)
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L424 | impactNotional > quoteUsed
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L426 | impactBid = impactNotional.fullMulDiv(1e18,baseAmount)
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L428 | (baseAmount,quoteUsed) = StorageLib.loadBook(self.asset).quoteAskInQuote(impactNotional)
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L430 | baseAmount += (impactNotional - quoteUsed).fullMulDiv(1e18,1)
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L430 | impactNotional > quoteUsed
(r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L432 | impactAsk = impactNotional.fullMulDiv(1e18,baseAmount)
(r) 🔗 MarketLib.getMidPrice | 🎯🟩#L438 | asset = self.asset
(r) 🔗 MarketLib.getMidPrice | 🎯🟩#L440 | bestBid = StorageLib.loadBook(asset).getBestBid()
(r) 🔗 MarketLib.getMidPrice | 🎯🟩#L441 | bestAsk = StorageLib.loadBook(asset).getBestAsk()
(r) 🔗 MarketLib.getMidPrice | 🎯🟩#L443 | bestAsk == type()(uint256).max || bestBid == 0
(r) 🔗 MarketLib.getFundingRateComponent | 🎯🟩#L454 | fundingRateEngine = StorageLib.loadFundingRateEngine(asset)
(r) 🔗 MarketLib._cacheBasisSpread | 🎯#L619 | midPrice = self.getMidPrice()
(r) 🔗 MarketLib._cacheBasisSpread | 🎯#L623 | basisSpread = midPrice.toInt256() - indexPrice.toInt256()
(r) 🔗 MarketLib._cacheImpactPrice | 🎯#L630 | impactNotional = uint256(500e18).fullMulDiv(StorageLib.loadMarketSettings(self.asset).maxOpenLeverage,1e18)
(r) 🔗 MarketLib._cacheImpactPrice | 🎯#L633 | impactPrice = self.getImpactPrice(impactNotional)
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L103 | pWad = history.snapshots[i].basisSpread * 1e18
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L104 | _ema = (pWad * k + _ema * (1e18 - k)) / 1e18
(r) 🔗 PriceHistoryLib.snapshot | 🎯#L27 | length = history.snapshots.length
(r) 🔗 PriceHistoryLib.snapshot | 🎯#L29 | length > 0 && history.snapshots[length - 1].timestamp == block.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L53 | idx = history.snapshots.length
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L57 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L62 | timePeriod = block.timestamp - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L63 | elapsedTime = timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L64 | weightedPrice = currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L65 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L67 | currentSnapshot.timestamp > targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L71 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L73 | currentSnapshot.timestamp < targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L75 | elapsedTime += timePeriod = previousTime - targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L77 | elapsedTime += timePeriod = previousTime - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L80 | weightedPrice += currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L81 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L89 | n = history.snapshots.length
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L90 | n == 0 || period == 0
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L94 | start = n - count
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L99 | _ema = history.snapshots[start].basisSpread * 1e18
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) AdminPanel.settleFunding(bytes32).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.settleFunding | 🎯💥❌ ['onlyAdmin']#L218 | market = StorageLib.loadMarket(asset)
(w) 🔗 FundingLib._calcFundingIndex | 🎯#L113 | self.resetIterationsLeft = settings.resetIterations
(w) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | -- self.resetIterationsLeft
(w) 🔗 FundingLib.settleFunding | 🎯#L51 | self.lastFundingTime = block.timestamp
(w) 🔗 FundingLib.settleFunding | 🎯#L62 | self.fundingRate = fundingRate
(r*) 🔗 FundingLib.settleFunding | 🎯#L54 | (fundingIndex,fundingRate) = _calcFundingIndex({self:self,settings:settings,markTwap:markTwap.toInt256(),indexTwap:indexTwap.toInt256()})
(r*) 🔗 MarketLib.settleFunding | 🎯#L206 | (funding,cumulativeFunding) = fundingRateEngine.settleFunding({asset:asset,markTwap:metadata.markPriceHistory.twap(interval),indexTwap:metadata.indexPriceHistory.twap(interval)})
(r) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | self.resetIterationsLeft > 0
(r) 🔗 FundingLib.settleFunding | 🎯#L61 | cumulativeFundingIndex = self.cumulativeFundingIndex += fundingIndex
(r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L88 | elapsedTime = self.getTimeSinceLastFunding()
(r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L89 | interval = self.getFundingInterval(asset)
(r) 🔗 MarketLib.settleFunding | 🎯#L199 | asset = self.asset
(r) 🔗 MarketLib.settleFunding | 🎯#L201 | fundingRateEngine = StorageLib.loadFundingRateEngine(asset)
(r) 🔗 MarketLib.settleFunding | 🎯#L202 | metadata = StorageLib.loadMarketMetadata(asset)
(r) 🔗 MarketLib.settleFunding | 🎯#L204 | interval = fundingRateEngine.getTimeSinceLastFunding()
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L53 | idx = history.snapshots.length
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L57 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L62 | timePeriod = block.timestamp - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L63 | elapsedTime = timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L64 | weightedPrice = currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L65 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L67 | currentSnapshot.timestamp > targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L71 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L73 | currentSnapshot.timestamp < targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L75 | elapsedTime += timePeriod = previousTime - targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L77 | elapsedTime += timePeriod = previousTime - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L80 | weightedPrice += currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L81 | previousTime = currentSnapshot.timestamp

(storage) AdminPanel.placeTwapOrder(address,PlaceOrderArgs,SignData).clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 AdminPanel.placeTwapOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L277 | clearingHouse = StorageLib.loadClearingHouse()
(i) (w) 🔗 AdminPanel.placeTwapOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L281 | clearingHouse.nonceUsed[account][signData.nonce] = true
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 AdminPanel.placeTwapOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L283 | clearingHouse.placeOrder(account,args,BookType.STANDARD)
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L114 | orderResult = market.placeOrder(account,args,bookType)
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L124 | StorageLib.loadCollateralManager().handleCollateralDelta({account:account,collateralDelta:collateralPosted.toInt256()})
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L132 | _processTakerFill(self,__FillParams__({asset:args.asset,account:account,subaccount:args.subaccount,side:args.side,quoteAmount:orderResult.quoteTraded,baseAmount:orderResult.baseTraded,collateralPosted:collateralPosted}))
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 AdminPanel.placeTwapOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L279 | _validateSig(clearingHouse,account,abi.encode(args),signData)
(i) (r) 🔗 AdminPanel._validateSig | 🎯🟩#L707 | clearingHouse.nonceUsed[signer][signData.nonce]
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L112 | market = self.market[args.asset]
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L117 | orderResult.basePosted > 0 && ! args.reduceOnly
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L118 | collateralPosted = _getCollateral(orderResult.basePosted,args.limitPrice,market.getPositionLeverage(account,args.subaccount))
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L123 | orderResult.baseTraded == 0
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L312 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L318 | finalMarginDelta = marginDelta.min((intendedMargin.toInt256() - equity).max(0))
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L320 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L585 | cache.assets = self.assets[params.account][params.subaccount].values().wrap()
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L599 | cache.positions = _getPositions(self,cache.assets,params.account,params.subaccount,isNewPosition)
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L622 | (cache.margin,cache.positionResult.marginDelta) = self.rebalanceAccount({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertNotLiquidatable | 🎯🟩#L748 | self.isLiquidatable(assets,positions,margin,BookType.STANDARD)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) AdminPanel.placeTPSLOrder(address,PlaceOrderArgs,Condition,SignData).clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 AdminPanel.placeTPSLOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L292 | clearingHouse = StorageLib.loadClearingHouse()
(i) (w) 🔗 AdminPanel.placeTPSLOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L296 | clearingHouse.nonceUsed[account][signData.nonce] = true
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 AdminPanel.placeTPSLOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L300 | clearingHouse.placeOrder(account,args,BookType.STANDARD)
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L114 | orderResult = market.placeOrder(account,args,bookType)
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L124 | StorageLib.loadCollateralManager().handleCollateralDelta({account:account,collateralDelta:collateralPosted.toInt256()})
(r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L132 | _processTakerFill(self,__FillParams__({asset:args.asset,account:account,subaccount:args.subaccount,side:args.side,quoteAmount:orderResult.quoteTraded,baseAmount:orderResult.baseTraded,collateralPosted:collateralPosted}))
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 AdminPanel.placeTPSLOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L294 | _validateSig(clearingHouse,account,abi.encode(args,condition),signData)
(i) (r) 🔗 AdminPanel.placeTPSLOrder | 🎯💥❌ ['onlyAdmin', 'onlyActiveProtocol']#L298 | ! clearingHouse.market[args.asset].isTPSLConditionMet(args.side,condition)
(i) (r) 🔗 AdminPanel._validateSig | 🎯🟩#L707 | clearingHouse.nonceUsed[signer][signData.nonce]
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L112 | market = self.market[args.asset]
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L117 | orderResult.basePosted > 0 && ! args.reduceOnly
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L118 | collateralPosted = _getCollateral(orderResult.basePosted,args.limitPrice,market.getPositionLeverage(account,args.subaccount))
(r) 🔗 ClearingHouseLib.placeOrder | 🎯#L123 | orderResult.baseTraded == 0
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L312 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L318 | finalMarginDelta = marginDelta.min((intendedMargin.toInt256() - equity).max(0))
(r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L320 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L585 | cache.assets = self.assets[params.account][params.subaccount].values().wrap()
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L599 | cache.positions = _getPositions(self,cache.assets,params.account,params.subaccount,isNewPosition)
(r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L622 | (cache.margin,cache.positionResult.marginDelta) = self.rebalanceAccount({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertNotLiquidatable | 🎯🟩#L748 | self.isLiquidatable(assets,positions,margin,BookType.STANDARD)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib.isTPSLConditionMet | 🎯🟩#L497 | mark = self.markPrice
(r) 🔗 MarketLib.isTPSLConditionMet | 🎯🟩#L500 | mark >= condition.triggerPrice
(r) 🔗 MarketLib.isTPSLConditionMet | 🎯🟩#L502 | mark <= condition.triggerPrice
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) AdminPanel.activateProtocol().clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 AdminPanel.activateProtocol | 🎯💥❌ ['onlyAdmin']#L320 | clearingHouse = StorageLib.loadClearingHouse()
    (🔀?clearingHouse.active?)  (w) 🔗 Launchpad._graduate | 🎯🟢🔴🌀#L315 | _launches[buyData.token].active = false

(storage) AdminPanel.deactivateProtocol().clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 AdminPanel.deactivateProtocol | 🎯💥❌ ['onlyAdmin']#L330 | clearingHouse = StorageLib.loadClearingHouse()
    (🔀?clearingHouse.active?)  (w) 🔗 Launchpad._graduate | 🎯🟢🔴🌀#L315 | _launches[buyData.token].active = false

(storage) AdminPanel.activateMarket(bytes32).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.activateMarket | 🎯💥❌ ['onlyAdmin']#L346 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.deactivateMarket(bytes32).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.deactivateMarket | 🎯💥❌ ['onlyAdmin']#L360 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.delistMarket(bytes32).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.delistMarket | 🎯💥❌ ['onlyAdmin']#L374 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.relistMarket(bytes32).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.relistMarket | 🎯💥❌ ['onlyAdmin']#L389 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.relistMarket(bytes32).marketMetadata | StorageLib.loadMarketMetadata(asset)
(i) (w) 🔗 AdminPanel.relistMarket | 🎯💥❌ ['onlyAdmin']#L390 | marketMetadata = StorageLib.loadMarketMetadata(asset)
(i) (r) 🔗 AdminPanel.relistMarket | 🎯💥❌ ['onlyAdmin']#L402 | marketMetadata.longOI + marketMetadata.shortOI > 0

(storage) AdminPanel.relistMarket(bytes32).book | StorageLib.loadBook(asset)
(i) (w) 🔗 AdminPanel.relistMarket | 🎯💥❌ ['onlyAdmin']#L391 | book = StorageLib.loadBook(asset)
(i) (r) 🔗 AdminPanel.relistMarket | 🎯💥❌ ['onlyAdmin']#L399 | book.metadata.baseOI + book.metadata.quoteOI > 0

(storage) AdminPanel.enableCrossMargin(bytes32).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.enableCrossMargin | 🎯💥❌ ['onlyAdmin']#L410 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.disableCrossMargin(bytes32).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.disableCrossMargin | 🎯💥❌ ['onlyAdmin']#L422 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setMaxLeverage(bytes32,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setMaxLeverage | 🎯💥❌ ['onlyAdmin']#L438 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setMinMarginRatio(bytes32,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setMinMarginRatio | 🎯💥❌ ['onlyAdmin']#L448 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setMinMarginRatio(bytes32,uint256).settings | StorageLib.loadMarketSettings(asset)
(i) (w) 🔗 AdminPanel.setMinMarginRatio | 🎯💥❌ ['onlyAdmin']#L449 | settings = StorageLib.loadMarketSettings(asset)
(i) (w) 🔗 AdminPanel.setMinMarginRatio | 🎯💥❌ ['onlyAdmin']#L455 | settings.maintenanceMarginRatio = maintenanceMarginRatio
(i) (r) 🔗 AdminPanel.setMinMarginRatio | 🎯💥❌ ['onlyAdmin']#L453 | _validateMaintenanceMarginRatio(maintenanceMarginRatio,settings.maxOpenLeverage)

(storage) AdminPanel.setLiquidationFeeRate(bytes32,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setLiquidationFeeRate | 🎯💥❌ ['onlyAdmin']#L464 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setDivergenceCap(bytes32,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setDivergenceCap | 🎯💥❌ ['onlyAdmin']#L478 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setReduceOnlyCap(bytes32,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setReduceOnlyCap | 🎯💥❌ ['onlyAdmin']#L489 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setPartialLiquidationThreshold(bytes32,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setPartialLiquidationThreshold | 🎯💥❌ ['onlyAdmin']#L503 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setPartialLiquidationRate(bytes32,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setPartialLiquidationRate | 🎯💥❌ ['onlyAdmin']#L517 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setFundingInterval(bytes32,uint256,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setFundingInterval | 🎯💥❌ ['onlyAdmin']#L530 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setFundingInterval(bytes32,uint256,uint256).settings | StorageLib.loadFundingRateSettings(asset)
(i) (w) 🔗 AdminPanel.setFundingInterval | 🎯💥❌ ['onlyAdmin']#L534 | settings = StorageLib.loadFundingRateSettings(asset)
(i) (w) 🔗 AdminPanel.setFundingInterval | 🎯💥❌ ['onlyAdmin']#L538 | settings.fundingInterval = fundingInterval
(i) (w) 🔗 AdminPanel.setFundingInterval | 🎯💥❌ ['onlyAdmin']#L539 | settings.resetInterval = resetInterval

(storage) AdminPanel.setResetIterations(bytes32,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setResetIterations | 🎯💥❌ ['onlyAdmin']#L547 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setFundingClamps(bytes32,uint256,uint256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setFundingClamps | 🎯💥❌ ['onlyAdmin']#L558 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setFundingClamps(bytes32,uint256,uint256).settings | StorageLib.loadFundingRateSettings(asset)
(i) (w) 🔗 AdminPanel.setFundingClamps | 🎯💥❌ ['onlyAdmin']#L562 | settings = StorageLib.loadFundingRateSettings(asset)
(i) (w) 🔗 AdminPanel.setFundingClamps | 🎯💥❌ ['onlyAdmin']#L564 | settings.innerClamp = innerClamp
(i) (w) 🔗 AdminPanel.setFundingClamps | 🎯💥❌ ['onlyAdmin']#L565 | settings.outerClamp = outerClamp

(storage) AdminPanel.setInterestRate(bytes32,int256).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setInterestRate | 🎯💥❌ ['onlyAdmin']#L573 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setMaxNumOrders(bytes32,uint256).book | StorageLib.loadBook(asset)
(i) (w) 🔗 AdminPanel.setMaxNumOrders | 🎯💥❌ ['onlyAdmin']#L585 | book = StorageLib.loadBook(asset)

(storage) AdminPanel.setMaxLimitsPerTx(bytes32,uint8).book | StorageLib.loadBook(asset)
(i) (w) 🔗 AdminPanel.setMaxLimitsPerTx | 🎯💥❌ ['onlyAdmin']#L597 | book = StorageLib.loadBook(asset)

(storage) AdminPanel.setMinLimitOrderAmountInBase(bytes32,uint256).book | StorageLib.loadBook(asset)
(i) (r) 🔗 AdminPanel.setMinLimitOrderAmountInBase | 🎯💥❌ ['onlyAdmin']#L611 | _validateConform(minLimitOrderAmountInBase,book.config.lotSize)

(storage) AdminPanel.setTickSize(bytes32,uint256).book | StorageLib.loadBook(asset)
(i) (w) 🔗 AdminPanel.setTickSize | 🎯💥❌ ['onlyAdmin']#L619 | book = StorageLib.loadBook(asset)
(i) (r) 🔗 AdminPanel.setTickSize | 🎯💥❌ ['onlyAdmin']#L624 | _validateMinBookValue(book.config.lotSize,tickSize)

(storage) AdminPanel.setMarketSettings(bytes32,MarketSettings).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setMarketSettings | 🎯💥❌ ['onlyAdmin']#L632 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setMarketSettings(bytes32,MarketSettings).marketSettings | StorageLib.loadMarketSettings(asset)
(i) (w) 🔗 AdminPanel.setMarketSettings | 🎯💥❌ ['onlyAdmin']#L633 | marketSettings = StorageLib.loadMarketSettings(asset)
(w) 🔗 MarketLib.init | 🎯#L115 | settings.status = initSettings.status
(w) 🔗 MarketLib.init | 🎯#L116 | settings.crossMarginEnabled = initSettings.crossMarginEnabled
(w) 🔗 MarketLib.init | 🎯#L117 | settings.maxOpenLeverage = initSettings.maxOpenLeverage
(w) 🔗 MarketLib.init | 🎯#L118 | settings.maintenanceMarginRatio = initSettings.maintenanceMarginRatio
(w) 🔗 MarketLib.init | 🎯#L119 | settings.liquidationFeeRate = initSettings.liquidationFeeRate
(w) 🔗 MarketLib.init | 🎯#L120 | settings.divergenceCap = initSettings.divergenceCap
(w) 🔗 MarketLib.init | 🎯#L121 | settings.reduceOnlyCap = initSettings.reduceOnlyCap
(w) 🔗 MarketLib.init | 🎯#L122 | settings.partialLiquidationThreshold = initSettings.partialLiquidationThreshold
(w) 🔗 MarketLib.init | 🎯#L123 | settings.partialLiquidationRate = initSettings.partialLiquidationRate
(i) (r*) 🔗 AdminPanel.setMarketSettings | 🎯💥❌ ['onlyAdmin']#L646 | marketSettings.init(settings)
(i) (r) 🔗 AdminPanel.setMarketSettings | 🎯💥❌ ['onlyAdmin']#L637 | marketSettings.status != settings.status
    (🔀?settings.status?)  (w) 🔗 CLOBStorageLib.init | 🎯#L543 | ss.status = marketSettings.status
    (🔀?settings.status?)  (w) 🔗 CLOBStorageLib.init | 🎯#L543 | ss.status = marketSettings.status

(storage) AdminPanel.setFundingRateSettings(bytes32,FundingRateSettings).market | StorageLib.loadMarket(asset)
(i) (w) 🔗 AdminPanel.setFundingRateSettings | 🎯💥❌ ['onlyAdmin']#L661 | market = StorageLib.loadMarket(asset)

(storage) AdminPanel.setBookSettings(bytes32,BookSettings).bookSettings | StorageLib.loadBookSettings(asset)
(i) (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L684 | bookSettings = StorageLib.loadBookSettings(asset)
(i) (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L686 | bookSettings.maxNumOrders = settings.maxNumOrders
(i) (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L687 | bookSettings.maxLimitsPerTx = settings.maxLimitsPerTx
(i) (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L688 | bookSettings.minLimitOrderAmountInBase = settings.minLimitOrderAmountInBase
(i) (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L689 | bookSettings.tickSize = settings.tickSize
    (🔀?bookSettings.maxNumOrders?)  (w) 🔗 CLOBLib.init | 🎯#L115 | dsSettings.maxNumOrders = bookSettings.maxNumOrders
    (🔀?bookSettings.maxLimitsPerTx?)  (w) 🔗 CLOBStorageLib.init | 🎯#L544 | ss.maxLimitsPerTx = marketSettings.maxLimitsPerTx
    (🔀?bookSettings.maxLimitsPerTx?)  (w) 🔗 CLOBStorageLib.init | 🎯#L544 | ss.maxLimitsPerTx = marketSettings.maxLimitsPerTx
    (🔀?bookSettings.maxLimitsPerTx?)  (w) 🔗 CLOBLib.init | 🎯#L116 | dsSettings.maxLimitsPerTx = bookSettings.maxLimitsPerTx
    (🔀?bookSettings.minLimitOrderAmountInBase?)  (w) 🔗 CLOBStorageLib.init | 🎯#L545 | ss.minLimitOrderAmountInBase = marketSettings.minLimitOrderAmountInBase
    (🔀?bookSettings.minLimitOrderAmountInBase?)  (w) 🔗 CLOBStorageLib.init | 🎯#L545 | ss.minLimitOrderAmountInBase = marketSettings.minLimitOrderAmountInBase
    (🔀?bookSettings.minLimitOrderAmountInBase?)  (w) 🔗 CLOBLib.init | 🎯#L117 | dsSettings.minLimitOrderAmountInBase = bookSettings.minLimitOrderAmountInBase
    (🔀?bookSettings.tickSize?)  (w) 🔗 CLOBStorageLib.init | 🎯#L546 | ss.tickSize = marketSettings.tickSize
    (🔀?bookSettings.tickSize?)  (w) 🔗 CLOBStorageLib.init | 🎯#L546 | ss.tickSize = marketSettings.tickSize
    (🔀?bookSettings.tickSize?)  (w) 🔗 CLOBLib.init | 🎯#L118 | dsSettings.tickSize = bookSettings.tickSize

(storage) AdminPanel._validateSig(ClearingHouse,address,bytes,SignData).clearingHouse |
(i) (r) 🔗 AdminPanel._validateSig | 🎯🟩#L707 | clearingHouse.nonceUsed[signer][signData.nonce]

Solidity Vars Used

msg.sender
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())

block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 AdminPanel._validateSig#708:13 | 🎯🟩 | signData.expiry < block.timestamp

this
this @ 🔗 Initializable.initializer#71:17 | 🌈🟢 | ! extcodesize(uint256)(address()()) < i_initializer_asm_0 >> 1 == 1

modifiers_html

functions_html

LiquidatorPanel,/home/ubuntu/2025-08-gte-perps/contracts/perps/modules/LiquidatorPanel.sol#40:1

state_vars_html

(storage) LiquidatorPanel.liquidate(bytes32,address,uint256).clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L162 | clearingHouse = StorageLib.loadClearingHouse()
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L164 | cache = _liquidate({clearingHouse:clearingHouse,asset:asset,account:account,subaccount:subaccount,bookType:BookType.STANDARD})
(i) (r*) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L218 | StorageLib.loadCollateralManager().settleFill(account,subaccount,cache.margin,cache.positionResult.marginDelta)
(i) (r*) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L222 | clearingHouse.updateAccount({account:account,subaccount:subaccount,assets:cache.assets,positions:cache.positions,tradedAsset:asset,positionIdx:cache.positionIdx,oiDelta:cache.positionResult.oiDelta,sideClose:cache.positionResult.sideClose})
(i) (r*) 🔗 LiquidatorPanel._liquidate | 🎯#L629 | cache.fillResult = clearingHouse.market[asset].liquidate({account:account,subaccount:subaccount,side:cache.side,amount:cache.positions[cache.positionIdx].amount,bookType:bookType})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib.liquidate | 🎯#L176 | result = CLOBLib.placeOrder(account,PlaceOrderArgs({subaccount:subaccount,asset:self.asset,side:side,limitPrice:0,amount:amount,baseDenominated:true,tif:TiF.IOC,expiryTime:0,clientOrderId:0,reduceOnly:true}),bookType)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L172 | fee = StorageLib.loadMarketSettings(asset).liquidationFeeRate.fullMulDiv(cache.fillResult.quoteTraded,1e18).toInt256()
(i) (r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L177 | cache.margin += cache.positionResult.rpnl - fee
(i) (r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L179 | (cache.margin,cache.positionResult.marginDelta) = clearingHouse.rebalanceClose({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(i) (r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L186 | fullClose = cache.positions[cache.positionIdx].amount == 0 && cache.positions.length == 1
(i) (r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L189 | fullClose && cache.positionResult.marginDelta < 0
(i) (r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L191 | cache.positionResult.marginDelta.abs() < cache.maintenanceOrProratedMargin
(i) (r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L202 | _emitLiquidationEvent({asset:asset,account:account,subaccount:subaccount,side:cache.side,quoteTraded:cache.fillResult.quoteTraded,baseTraded:cache.fillResult.baseTraded,rpnl:cache.positionResult.rpnl,margin:cache.margin,fee:fee,liquidationType:LiquidationType.LIQUIDATEE})
(i) (r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L215 | StorageLib.loadInsuranceFund().pay(fee.abs())
(i) (r) 🔗 LiquidatorPanel.liquidate | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L216 | StorageLib.loadInsuranceFund().claim(fee.abs())
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L600 | (assets,positions,margin) = clearingHouse.getAccountAndMargin(account,subaccount)
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L602 | positionIdx = assets.indexOf(asset)
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L604 | positionIdx == type()(uint256).max
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L606 | margin -= ClearingHouseLib.realizeFundingPayment(assets,positions)
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L619 | (cache.assets,cache.positions,cache.margin,cache.positionIdx) = _setupAccountAndValidateLiquidation({clearingHouse:clearingHouse,account:account,subaccount:subaccount,asset:asset,bookType:bookType})
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L639 | proratedMargin = clearingHouse.getProratedMargin(cache.assets,cache.positions,asset,cache.margin)
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L641 | cache.maintenanceOrProratedMargin = proratedMargin.toUint256()
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L653 | cache.maintenanceOrProratedMargin = clearingHouse.market[asset].getMaintenanceMargin(cache.positions[cache.positionIdx].amount)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertLiquidatable | 🎯🟩#L758 | ! self.isLiquidatable(assets,positions,margin,bookType)
(r) 🔗 MarketLib.liquidate | 🎯#L174 | amount = _getLiquidationAmount(self,amount)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._getLiquidationAmount | 🎯🟩#L571 | positionAmount.fullMulDiv(self.markPrice,1e18) < StorageLib.loadMarketSettings(self.asset).partialLiquidationThreshold
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel.backstopLiquidate(bytes32,address,uint256).clearingHouse | StorageLib.loadClearingHouse()
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L241 | cache = _liquidate({clearingHouse:clearingHouse,asset:asset,account:account,subaccount:subaccount,bookType:BookType.BACKSTOP})
(i) (r*) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L260 | fee = _settleBackstopLiquidation(clearingHouse,asset,proratedMargin.toUint256()).toInt256()
(i) (r*) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L284 | StorageLib.loadCollateralManager().settleFill(account,subaccount,cache.margin,0)
(i) (r*) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L286 | clearingHouse.updateAccount({account:account,subaccount:subaccount,assets:cache.assets,positions:cache.positions,tradedAsset:asset,positionIdx:cache.positionIdx,oiDelta:cache.positionResult.oiDelta,sideClose:cache.positionResult.sideClose})
(i) (r*) 🔗 LiquidatorPanel._liquidate | 🎯#L629 | cache.fillResult = clearingHouse.market[asset].liquidate({account:account,subaccount:subaccount,side:cache.side,amount:cache.positions[cache.positionIdx].amount,bookType:bookType})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib.liquidate | 🎯#L176 | result = CLOBLib.placeOrder(account,PlaceOrderArgs({subaccount:subaccount,asset:self.asset,side:side,limitPrice:0,amount:amount,baseDenominated:true,tif:TiF.IOC,expiryTime:0,clientOrderId:0,reduceOnly:true}),bookType)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L249 | proratedMargin = cache.maintenanceOrProratedMargin.toInt256()
(i) (r) 🔗 LiquidatorPanel.backstopLiquidate | 🎯💥❌ ['onlyBackstopLiquidator', 'onlyActiveProtocol']#L268 | _emitLiquidationEvent({asset:asset,account:account,subaccount:subaccount,side:cache.side,quoteTraded:cache.fillResult.quoteTraded,baseTraded:cache.fillResult.baseTraded,rpnl:cache.positionResult.rpnl,margin:cache.margin,fee:fee,liquidationType:LiquidationType.BACKSTOP_LIQUIDATEE})
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L600 | (assets,positions,margin) = clearingHouse.getAccountAndMargin(account,subaccount)
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L602 | positionIdx = assets.indexOf(asset)
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L604 | positionIdx == type()(uint256).max
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L606 | margin -= ClearingHouseLib.realizeFundingPayment(assets,positions)
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L619 | (cache.assets,cache.positions,cache.margin,cache.positionIdx) = _setupAccountAndValidateLiquidation({clearingHouse:clearingHouse,account:account,subaccount:subaccount,asset:asset,bookType:bookType})
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L639 | proratedMargin = clearingHouse.getProratedMargin(cache.assets,cache.positions,asset,cache.margin)
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L641 | cache.maintenanceOrProratedMargin = proratedMargin.toUint256()
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L653 | cache.maintenanceOrProratedMargin = clearingHouse.market[asset].getMaintenanceMargin(cache.positions[cache.positionIdx].amount)
(i) (r) 🔗 LiquidatorPanel._settleBackstopLiquidation | 🎯#L681 | points[i] = clearingHouse.liquidatorPoints[data[i].liquidator]
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertLiquidatable | 🎯🟩#L758 | ! self.isLiquidatable(assets,positions,margin,bookType)
(r) 🔗 MarketLib.liquidate | 🎯#L174 | amount = _getLiquidationAmount(self,amount)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._getLiquidationAmount | 🎯🟩#L571 | positionAmount.fullMulDiv(self.markPrice,1e18) < StorageLib.loadMarketSettings(self.asset).partialLiquidationThreshold
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel.deleverage(bytes32,DeleveragePair[]).clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 LiquidatorPanel.deleverage | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L299 | clearingHouse = StorageLib.loadClearingHouse()
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 LiquidatorPanel.deleverage | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L302 | _deleveragePair(clearingHouse,asset,pairs[i])
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L404 | (cache.makerAssets,cache.makerPositions,cache.makerMargin) = clearingHouse.getAccountAndMargin(pair.maker.account,pair.maker.subaccount)
(i) (r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L406 | (cache.takerAssets,cache.takerPositions,cache.takerMargin) = clearingHouse.getAccountAndMargin(pair.taker.account,pair.taker.subaccount)
(i) (r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L436 | bankruptcyPrice = _getBankruptcyPrice({position:cache.makerPositions[makerPositionIdx],closeSize:cache.baseAmount,proratedMargin:clearingHouse.getProratedMargin(cache.makerAssets,cache.makerPositions,asset,cache.makerMargin)})
(i) (r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L444 | cache.quoteAmount = cache.baseAmount.fullMulDiv(bankruptcyPrice,1e18)
(i) (r) 🔗 LiquidatorPanel._deleverage | 🎯#L491 | (params.margin,result.marginDelta) = clearingHouse.rebalanceClose({assets:params.assets,positions:params.positions,margin:params.margin,marginDelta:0})
(i) (r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L568 | ! clearingHouse.hasBadDebt(params.makerAssets,params.makerPositions,params.makerMargin)
(i) (r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L573 | ! clearingHouse.isOpenMarginRequirementMet(params.takerAssets,params.takerPositions,params.takerMargin)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L529 | minOpenMargin += self.market[assets.getBytes32(i)].getMinOpenMargin(positions[i].amount)
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L530 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib.hasBadDebt | 🎯🟩#L544 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L348 | positionNotional = positionAmount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L350 | minOpenMargin = positionNotional.fullMulDiv(1e18,StorageLib.loadMarketSettings(self.asset).maxOpenLeverage)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel.delistClose(bytes32,Account[]).clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 LiquidatorPanel.delistClose | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L307 | clearingHouse = StorageLib.loadClearingHouse()
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 LiquidatorPanel.delistClose | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L313 | _delistClose(clearingHouse,market,asset,accounts[i])
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 LiquidatorPanel._delistClose | 🎯#L329 | (cache.assets,cache.positions,cache.margin) = clearingHouse.getAccountAndMargin(account.account,account.subaccount)
(i) (r) 🔗 LiquidatorPanel._delistClose | 🎯#L340 | cache.quoteTraded = cache.baseTraded.fullMulDiv(market.markPrice,1e18)
(i) (r) 🔗 LiquidatorPanel._delistClose | 🎯#L353 | (cache.margin,cache.positionResult.marginDelta) = clearingHouse.rebalanceClose({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel.delistClose(bytes32,Account[]).market | clearingHouse.market[asset]
(i) (r*) 🔗 LiquidatorPanel.delistClose | 🎯💥❌ ['onlyLiquidator', 'onlyActiveProtocol']#L313 | _delistClose(clearingHouse,market,asset,accounts[i])
(i) (r) 🔗 LiquidatorPanel._delistClose | 🎯#L340 | cache.quoteTraded = cache.baseTraded.fullMulDiv(market.markPrice,1e18)

(storage) LiquidatorPanel._delistClose(ClearingHouse,Market,bytes32,Account).clearingHouse |
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 LiquidatorPanel._delistClose | 🎯#L386 | clearingHouse.updateAccount({account:account.account,subaccount:account.subaccount,assets:cache.assets,positions:cache.positions,tradedAsset:asset,positionIdx:positionIdx,oiDelta:cache.positionResult.oiDelta,sideClose:true})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 LiquidatorPanel._delistClose | 🎯#L329 | (cache.assets,cache.positions,cache.margin) = clearingHouse.getAccountAndMargin(account.account,account.subaccount)
(i) (r) 🔗 LiquidatorPanel._delistClose | 🎯#L353 | (cache.margin,cache.positionResult.marginDelta) = clearingHouse.rebalanceClose({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel._delistClose(ClearingHouse,Market,bytes32,Account).market |
(i) (r) 🔗 LiquidatorPanel._delistClose | 🎯#L340 | cache.quoteTraded = cache.baseTraded.fullMulDiv(market.markPrice,1e18)

(storage) LiquidatorPanel._deleveragePair(ClearingHouse,bytes32,DeleveragePair).clearingHouse |
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 LiquidatorPanel._deleveragePair | 🎯#L446 | _deleverage(clearingHouse,__DeleverageParams__({account:pair.maker.account,subaccount:pair.maker.subaccount,asset:asset,assets:cache.makerAssets,positions:cache.makerPositions,positionIdx:makerPositionIdx,baseTraded:cache.baseAmount,quoteTraded:cache.quoteAmount,margin:cache.makerMargin,deleverageType:LiquidationType.DELEVERAGE_MAKER}))
(i) (r*) 🔗 LiquidatorPanel._deleveragePair | 🎯#L462 | _deleverage(clearingHouse,__DeleverageParams__({account:pair.taker.account,subaccount:pair.taker.subaccount,asset:asset,assets:cache.takerAssets,positions:cache.takerPositions,positionIdx:takerPositionIdx,baseTraded:cache.baseAmount,quoteTraded:cache.quoteAmount,margin:cache.takerMargin,deleverageType:LiquidationType.DELEVERAGE_TAKER}))
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L404 | (cache.makerAssets,cache.makerPositions,cache.makerMargin) = clearingHouse.getAccountAndMargin(pair.maker.account,pair.maker.subaccount)
(i) (r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L406 | (cache.takerAssets,cache.takerPositions,cache.takerMargin) = clearingHouse.getAccountAndMargin(pair.taker.account,pair.taker.subaccount)
(i) (r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L417 | _validateDeleveragePair(clearingHouse,__DeleverageValidationParams__({asset:asset,makerAssets:cache.makerAssets,takerAssets:cache.takerAssets,makerPositions:cache.makerPositions,takerPositions:cache.takerPositions,makerPositionIdx:makerPositionIdx,takerPositionIdx:takerPositionIdx,makerMargin:cache.makerMargin,takerMargin:cache.takerMargin}))
(i) (r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L436 | bankruptcyPrice = _getBankruptcyPrice({position:cache.makerPositions[makerPositionIdx],closeSize:cache.baseAmount,proratedMargin:clearingHouse.getProratedMargin(cache.makerAssets,cache.makerPositions,asset,cache.makerMargin)})
(i) (r) 🔗 LiquidatorPanel._deleveragePair | 🎯#L444 | cache.quoteAmount = cache.baseAmount.fullMulDiv(bankruptcyPrice,1e18)
(i) (r) 🔗 LiquidatorPanel._deleverage | 🎯#L491 | (params.margin,result.marginDelta) = clearingHouse.rebalanceClose({assets:params.assets,positions:params.positions,margin:params.margin,marginDelta:0})
(i) (r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L568 | ! clearingHouse.hasBadDebt(params.makerAssets,params.makerPositions,params.makerMargin)
(i) (r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L573 | ! clearingHouse.isOpenMarginRequirementMet(params.takerAssets,params.takerPositions,params.takerMargin)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L529 | minOpenMargin += self.market[assets.getBytes32(i)].getMinOpenMargin(positions[i].amount)
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L530 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib.hasBadDebt | 🎯🟩#L544 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L348 | positionNotional = positionAmount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L350 | minOpenMargin = positionNotional.fullMulDiv(1e18,StorageLib.loadMarketSettings(self.asset).maxOpenLeverage)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel._deleverage(ClearingHouse,LiquidatorPanel.__DeleverageParams__).clearingHouse |
(w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 LiquidatorPanel._deleverage | 🎯#L528 | clearingHouse.updateAccount({account:params.account,subaccount:params.subaccount,assets:params.assets,positions:params.positions,tradedAsset:params.asset,positionIdx:params.positionIdx,oiDelta:result.oiDelta,sideClose:result.sideClose})
(r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 LiquidatorPanel._deleverage | 🎯#L491 | (params.margin,result.marginDelta) = clearingHouse.rebalanceClose({assets:params.assets,positions:params.positions,margin:params.margin,marginDelta:0})
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel._validateDeleveragePair(ClearingHouse,LiquidatorPanel.__DeleverageValidationParams__).clearingHouse |
(i) (r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L568 | ! clearingHouse.hasBadDebt(params.makerAssets,params.makerPositions,params.makerMargin)
(i) (r) 🔗 LiquidatorPanel._validateDeleveragePair | 🎯🟩#L573 | ! clearingHouse.isOpenMarginRequirementMet(params.takerAssets,params.takerPositions,params.takerMargin)
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L529 | minOpenMargin += self.market[assets.getBytes32(i)].getMinOpenMargin(positions[i].amount)
(r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L530 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib.hasBadDebt | 🎯🟩#L544 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L348 | positionNotional = positionAmount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L350 | minOpenMargin = positionNotional.fullMulDiv(1e18,StorageLib.loadMarketSettings(self.asset).maxOpenLeverage)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)

(storage) LiquidatorPanel._setupAccountAndValidateLiquidation(ClearingHouse,address,uint256,bytes32,BookType).clearingHouse |
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L600 | (assets,positions,margin) = clearingHouse.getAccountAndMargin(account,subaccount)
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L602 | positionIdx = assets.indexOf(asset)
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L604 | positionIdx == type()(uint256).max
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L606 | margin -= ClearingHouseLib.realizeFundingPayment(assets,positions)
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L608 | clearingHouse.assertLiquidatable(assets,positions,margin,bookType)
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertLiquidatable | 🎯🟩#L758 | ! self.isLiquidatable(assets,positions,margin,bookType)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel._liquidate(ClearingHouse,bytes32,address,uint256,BookType).clearingHouse |
(i) (r*) 🔗 LiquidatorPanel._liquidate | 🎯#L629 | cache.fillResult = clearingHouse.market[asset].liquidate({account:account,subaccount:subaccount,side:cache.side,amount:cache.positions[cache.positionIdx].amount,bookType:bookType})
(r*) 🔗 MarketLib.liquidate | 🎯#L176 | result = CLOBLib.placeOrder(account,PlaceOrderArgs({subaccount:subaccount,asset:self.asset,side:side,limitPrice:0,amount:amount,baseDenominated:true,tif:TiF.IOC,expiryTime:0,clientOrderId:0,reduceOnly:true}),bookType)
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L600 | (assets,positions,margin) = clearingHouse.getAccountAndMargin(account,subaccount)
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L602 | positionIdx = assets.indexOf(asset)
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L604 | positionIdx == type()(uint256).max
(i) (r) 🔗 LiquidatorPanel._setupAccountAndValidateLiquidation | 🎯🟩#L606 | margin -= ClearingHouseLib.realizeFundingPayment(assets,positions)
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L619 | (cache.assets,cache.positions,cache.margin,cache.positionIdx) = _setupAccountAndValidateLiquidation({clearingHouse:clearingHouse,account:account,subaccount:subaccount,asset:asset,bookType:bookType})
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L639 | proratedMargin = clearingHouse.getProratedMargin(cache.assets,cache.positions,asset,cache.margin)
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L641 | cache.maintenanceOrProratedMargin = proratedMargin.toUint256()
(i) (r) 🔗 LiquidatorPanel._liquidate | 🎯#L653 | cache.maintenanceOrProratedMargin = clearingHouse.market[asset].getMaintenanceMargin(cache.positions[cache.positionIdx].amount)
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib.assertLiquidatable | 🎯🟩#L758 | ! self.isLiquidatable(assets,positions,margin,bookType)
(r) 🔗 MarketLib.liquidate | 🎯#L174 | amount = _getLiquidationAmount(self,amount)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._getLiquidationAmount | 🎯🟩#L571 | positionAmount.fullMulDiv(self.markPrice,1e18) < StorageLib.loadMarketSettings(self.asset).partialLiquidationThreshold
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) LiquidatorPanel._settleBackstopLiquidation(ClearingHouse,bytes32,uint256).clearingHouse |
(i) (r) 🔗 LiquidatorPanel._settleBackstopLiquidation | 🎯#L681 | points[i] = clearingHouse.liquidatorPoints[data[i].liquidator]

Solidity Vars Used

msg.sender
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)

block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()

modifiers_html

functions_html

ViewPort,/home/ubuntu/2025-08-gte-perps/contracts/perps/modules/ViewPort.sol#23:1

state_vars_html

(storage) ViewPort.getOrderbookCollateral(address,uint256).clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 ViewPort.getOrderbookCollateral | 🎯💥🟩#L89 | clearingHouse = StorageLib.loadClearingHouse()
(i) (r) 🔗 ViewPort.getOrderbookCollateral | 🎯💥🟩#L90 | assets = clearingHouse.assets[account][subaccount].values()
(i) (r) 🔗 ViewPort.getOrderbookCollateral | 🎯💥🟩#L93 | orderbookCollateral += clearingHouse.market[assets[i]].getOrderBookCollateral(account,subaccount)
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ViewPort.getAccountValue(address,uint256).clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 ViewPort.getAccountValue | 🎯💥🟩#L98 | clearingHouse = StorageLib.loadClearingHouse()
(i) (r) 🔗 ViewPort.getAccountValue | 🎯💥🟩#L100 | (assets,positions,margin) = clearingHouse.getAccountAndMargin(account,subaccount)
(i) (r) 🔗 ViewPort.getAccountValue | 🎯💥🟩#L103 | fundingPayment = clearingHouse.getFundingPayment(account,subaccount)
(i) (r) 🔗 ViewPort.getAccountValue | 🎯💥🟩#L104 | upnl = clearingHouse.getUpnl(assets,positions)
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(r) 🔗 ClearingHouseLib.getUpnl | 🎯🟩#L410 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 ClearingHouseLib.getFundingPayment | 🎯🟩#L478 | assets = self.assets[account][subaccount].values()
(r) 🔗 ClearingHouseLib.getFundingPayment | 🎯🟩#L481 | fundingPayment += self.market[assets[i]].getFundingPayment(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib.getFundingPayment | 🎯🟩#L403 | position = self.position[account][subaccount]
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ViewPort.getNextEmptySubaccount(address).clearingHouse | StorageLib.loadClearingHouse()
(i) (w) 🔗 ViewPort.getNextEmptySubaccount | 🎯💥🟩#L134 | clearingHouse = StorageLib.loadClearingHouse()
(i) (r) 🔗 ViewPort.getNextEmptySubaccount | 🎯💥🟩#L137 | clearingHouse.assets[account][i].length() == 0
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ViewPort.getOpenInterest(bytes32).metadata | StorageLib.loadMarketMetadata(asset)
(i) (w) 🔗 ViewPort.getOpenInterest | 🎯💥🟩#L210 | metadata = StorageLib.loadMarketMetadata(asset)
(i) (r) 🔗 ViewPort.getOpenInterest | 🎯💥🟩#L212 | longOi = metadata.longOI
(i) (r) 🔗 ViewPort.getOpenInterest | 🎯💥🟩#L213 | shortOi = metadata.shortOI

(storage) ViewPort.getOpenInterestBook(bytes32).book | StorageLib.loadBook(asset)
(i) (w) 🔗 ViewPort.getOpenInterestBook | 🎯💥🟩#L217 | book = StorageLib.loadBook(asset)
(i) (r) 🔗 ViewPort.getOpenInterestBook | 🎯💥🟩#L219 | baseOi = book.metadata.baseOI
(i) (r) 🔗 ViewPort.getOpenInterestBook | 🎯💥🟩#L220 | quoteOi = book.metadata.quoteOI

(storage) ViewPort.getOpenInterestBackstopBook(bytes32).book | StorageLib.loadBackstopBook(asset)
(i) (w) 🔗 ViewPort.getOpenInterestBackstopBook | 🎯💥🟩#L224 | book = StorageLib.loadBackstopBook(asset)
(i) (r) 🔗 ViewPort.getOpenInterestBackstopBook | 🎯💥🟩#L226 | baseOi = book.metadata.baseOI
(i) (r) 🔗 ViewPort.getOpenInterestBackstopBook | 🎯💥🟩#L227 | quoteOi = book.metadata.quoteOI

(storage) ViewPort.getFundingClamps(bytes32).settings | StorageLib.loadFundingRateSettings(asset)
(i) (w) 🔗 ViewPort.getFundingClamps | 🎯💥🟩#L355 | settings = StorageLib.loadFundingRateSettings(asset)
(i) (r) 🔗 ViewPort.getFundingClamps | 🎯💥🟩#L356 | (settings.innerClamp,settings.outerClamp)

Solidity Vars Used

msg.sender
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 AccountManager.withdrawToPerps#221:13 | 🎯💥🟢🌀 | msg.sender != address(perpManager)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 SimpleBondingCurve.onlyLaunchpadOwner#54:13 | 🎯🌈🟢🌀 | msg.sender != Ownable(launchpad).owner()
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])
this @ 🔗 GTL.orderbookCollateral#219:13 | 🎯💥🟢🟩🌀 | collateral += IViewPort(perpManager).getOrderbookCollateral(address(this),subaccounts[i])
this @ 🔗 GTL.freeCollateralBalance#224:9 | 🎯💥🟢🟩🌀 | IViewPort(perpManager).getFreeCollateralBalance(address(this))

block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()

modifiers_html

functions_html

BackstopLiquidatorDataLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/BackstopLiquidatorDataLib.sol#6:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

modifiers_html

functions_html

BookLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/Book.sol#56:1

state_vars_html

(storage) BookLib.exists(Book).self |
(i) (r) 🔗 BookLib.exists | 🎯🟩#L79 | self.config.asset != bytes32(0)

(storage) BookLib.assertLimitPriceInBounds(Book,uint256).self |
(i) (r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L83 | tickSize = StorageLib.loadBookSettings(self.config.asset).tickSize
(i) (r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L85 | price == 0 || price % tickSize != 0

(storage) BookLib.assertPriceInBounds(Book,uint256).self |
(i) (r) 🔗 BookLib.assertPriceInBounds | 🎯🟩#L90 | price % StorageLib.loadBookSettings(self.config.asset).tickSize != 0

(storage) BookLib.assertOrdersAtLimit(Book,uint256,Side).self |
(i) (r) 🔗 BookLib.assertOrdersAtLimit | 🎯🟩#L94 | self.getLimit(price,side).numOrders == 0

(storage) BookLib.assertLimitOrderAmountInBounds(Book,uint256).self |
(i) (r) 🔗 BookLib.assertLimitOrderAmountInBounds | 🎯🟩#L101 | orderAmountInBase % self.config.lotSize != 0
(i) (r) 🔗 BookLib.assertLimitOrderAmountInBounds | 🎯🟩#L98 | orderAmountInBase < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase

(storage) BookLib.assertUnusedOrderId(Book,uint256).self |
(i) (r) 🔗 BookLib.assertUnusedOrderId | 🎯🟩#L105 | self.orders[orderId.wrap()].owner != address(0)

(storage) BookLib.getBestBid(Book).self |
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(i) (r) 🔗 BookLib.getBestBid | 🎯🟩#L112 | self.bidTree.maximum()
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.getBestAsk(Book).self |
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(i) (r) 🔗 BookLib.getBestAsk | 🎯🟩#L117 | self.askTree.minimum()
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.getMinBidPrice(Book).self |
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(i) (r) 🔗 BookLib.getMinBidPrice | 🎯🟩#L122 | self.bidTree.minimum()
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.getMaxAskPrice(Book).self |
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(i) (r) 🔗 BookLib.getMaxAskPrice | 🎯🟩#L127 | self.askTree.maximum()
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.getLimit(Book,uint256,Side).self |
(i) (r) 🔗 BookLib.getLimit | 🎯🟩#L140 | self.bidLimits[price]

(storage) BookLib.getNextBiggestPrice(Book,uint256,Side).self |
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(i) (r) 🔗 BookLib.getNextBiggestPrice | 🎯🟩#L144 | self.bidTree.getNextBiggest(price)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.getNextSmallestPrice(Book,uint256,Side).self |
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(i) (r) 🔗 BookLib.getNextSmallestPrice | 🎯🟩#L148 | self.bidTree.getNextSmallest(price)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.getTradedAmounts(Book,uint256,uint256,uint256,bool).self |
(i) (r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(i) (r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(i) (r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize

(storage) BookLib.boundToLots(Book,uint256).self |
(i) (r) 🔗 BookLib.boundToLots | 🎯🟩#L176 | lotSize = self.config.lotSize

(storage) BookLib.getPostableBaseAmount(Book,uint256).self |
(i) (r) 🔗 BookLib.boundToLots | 🎯🟩#L176 | lotSize = self.config.lotSize
(i) (r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L186 | postableBaseAmount = self.boundToLots(baseAmount)
(i) (r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L188 | postableBaseAmount < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase

(storage) BookLib.quoteBidInBase(Book,uint256).self |
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(i) (r) 🔗 BookLib.quoteBidInBase | 🎯🟩#L196 | bestAsk = self.getBestAsk()
(i) (r) 🔗 BookLib.quoteBidInBase | 🎯🟩#L201 | bestAsk == type()(uint256).max
(i) (r) 🔗 BookLib.quoteBidInBase | 🎯🟩#L203 | (quoteFromLimit,baseFromLimit) = _getQuoteLimit(self,self.askLimits[bestAsk],bestAsk,baseAmount)
(i) (r) 🔗 BookLib.quoteBidInBase | 🎯🟩#L205 | quoteAmount += quoteFromLimit
(i) (r) 🔗 BookLib.quoteBidInBase | 🎯🟩#L206 | baseUsed += baseFromLimit
(i) (r) 🔗 BookLib.quoteBidInBase | 🎯🟩#L207 | baseAmount -= baseFromLimit
(i) (r) 🔗 BookLib.quoteBidInBase | 🎯🟩#L208 | bestAsk = self.getNextBiggestPrice(bestAsk,Side.SELL)
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L461 | numOrders = limit.numOrders
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L462 | orderId = limit.headOrder
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L465 | i < numOrders
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L467 | orderId.unwrap() == 0
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L469 | fillAmount = self.orders[orderId].amount.min(baseAmount)
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L471 | quoteAmount += fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L472 | baseAmount -= fillAmount
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L473 | baseUsed += fillAmount
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L475 | orderId = self.orders[orderId].nextOrderId
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.quoteBidInQuote(Book,uint256).self |
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(i) (r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L217 | bestAsk = self.getBestAsk()
(i) (r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L222 | bestAsk == type()(uint256).max
(i) (r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L224 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.askLimits[bestAsk],bestAsk,quoteAmount)
(i) (r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L226 | baseAmount += baseFromLimit
(i) (r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L227 | quoteUsed += quoteFromLimit
(i) (r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L228 | quoteAmount -= quoteFromLimit
(i) (r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L229 | bestAsk = self.getNextBiggestPrice(bestAsk,Side.SELL)
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L484 | numOrders = limit.numOrders
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L485 | orderId = limit.headOrder
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L488 | i < numOrders
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L490 | orderId.unwrap() == 0
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L492 | fillAmount = self.orders[orderId].amount.min(quoteAmount.fullMulDiv(1e18,price))
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L494 | baseAmount += fillAmount
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L495 | quoteUsed += fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L496 | quoteAmount -= fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L498 | orderId = self.orders[orderId].nextOrderId
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.quoteAskInBase(Book,uint256).self |
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(i) (r) 🔗 BookLib.quoteAskInBase | 🎯🟩#L238 | bestBid = self.getBestBid()
(i) (r) 🔗 BookLib.quoteAskInBase | 🎯🟩#L245 | (quoteFromLimit,baseFromLimit) = _getQuoteLimit(self,self.bidLimits[bestBid],bestBid,baseAmount)
(i) (r) 🔗 BookLib.quoteAskInBase | 🎯🟩#L247 | quoteAmount += quoteFromLimit
(i) (r) 🔗 BookLib.quoteAskInBase | 🎯🟩#L248 | baseUsed += baseFromLimit
(i) (r) 🔗 BookLib.quoteAskInBase | 🎯🟩#L249 | baseAmount -= baseFromLimit
(i) (r) 🔗 BookLib.quoteAskInBase | 🎯🟩#L250 | bestBid = self.getNextSmallestPrice(bestBid,Side.BUY)
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L461 | numOrders = limit.numOrders
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L462 | orderId = limit.headOrder
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L465 | i < numOrders
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L467 | orderId.unwrap() == 0
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L469 | fillAmount = self.orders[orderId].amount.min(baseAmount)
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L471 | quoteAmount += fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L472 | baseAmount -= fillAmount
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L473 | baseUsed += fillAmount
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L475 | orderId = self.orders[orderId].nextOrderId
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.quoteAskInQuote(Book,uint256).self |
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(i) (r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L259 | bestBid = self.getBestBid()
(i) (r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L266 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.bidLimits[bestBid],bestBid,quoteAmount)
(i) (r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L268 | baseAmount += baseFromLimit
(i) (r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L269 | quoteUsed += quoteFromLimit
(i) (r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L270 | quoteAmount -= quoteFromLimit
(i) (r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L271 | bestBid = self.getNextSmallestPrice(bestBid,Side.BUY)
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L484 | numOrders = limit.numOrders
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L485 | orderId = limit.headOrder
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L488 | i < numOrders
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L490 | orderId.unwrap() == 0
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L492 | fillAmount = self.orders[orderId].amount.min(quoteAmount.fullMulDiv(1e18,price))
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L494 | baseAmount += fillAmount
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L495 | quoteUsed += fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L496 | quoteAmount -= fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L498 | orderId = self.orders[orderId].nextOrderId
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.getNextOrders(Book,OrderId,uint256).self |
(i) (w) 🔗 BookLib.getNextOrders | 🎯🟩#L291 | currentOrder = self.orders[currentOrder.nextOrderId]
(i) (w) 🔗 BookLib.getNextOrders | 🎯🟩#L299 | currentOrder = self.orders[nextLimit.headOrder]
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L280 | currentOrder = self.orders[startOrderId]
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L281 | currentOrder.assertExists()
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L286 | count < numOrders && ! currentOrder.isNull()
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L287 | orders[count] = currentOrder
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L290 | currentOrder.nextOrderId.unwrap() != 0
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L293 | nextPrice = self.getNextBiggestPrice(currentOrder.price,currentOrder.side)
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L295 | nextPrice == 0
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L297 | nextLimit = self.getLimit(nextPrice,currentOrder.side)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib.getNextOrders(Book,OrderId,uint256).currentOrder | self.orders[startOrderId]
(i) (w) 🔗 BookLib.getNextOrders | 🎯🟩#L280 | currentOrder = self.orders[startOrderId]
(i) (w) 🔗 BookLib.getNextOrders | 🎯🟩#L291 | currentOrder = self.orders[currentOrder.nextOrderId]
(i) (w) 🔗 BookLib.getNextOrders | 🎯🟩#L299 | currentOrder = self.orders[nextLimit.headOrder]
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L281 | currentOrder.assertExists()
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L286 | count < numOrders && ! currentOrder.isNull()
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L287 | orders[count] = currentOrder
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L290 | currentOrder.nextOrderId.unwrap() != 0
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L293 | nextPrice = self.getNextBiggestPrice(currentOrder.price,currentOrder.side)
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L295 | nextPrice == 0
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L297 | nextLimit = self.getLimit(nextPrice,currentOrder.side)

(storage) BookLib.getNextOrders(Book,OrderId,uint256).nextLimit | self.getLimit(nextPrice,currentOrder.side)
(i) (w) 🔗 BookLib.getNextOrders | 🎯🟩#L297 | nextLimit = self.getLimit(nextPrice,currentOrder.side)
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L286 | count < numOrders && ! currentOrder.isNull()
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L287 | orders[count] = currentOrder
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L290 | currentOrder.nextOrderId.unwrap() != 0
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L291 | currentOrder = self.orders[currentOrder.nextOrderId]
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L293 | nextPrice = self.getNextBiggestPrice(currentOrder.price,currentOrder.side)
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L295 | nextPrice == 0
(i) (r) 🔗 BookLib.getNextOrders | 🎯🟩#L299 | currentOrder = self.orders[nextLimit.headOrder]

(storage) BookLib.toOrderId(Book,address,uint96).self |
(i) (r*) 🔗 BookLib.toOrderId | 🎯#L307 | self.incrementOrderId()
(i) (r) 🔗 BookLib.assertUnusedOrderId | 🎯🟩#L105 | self.orders[orderId.wrap()].owner != address(0)
(i) (r) 🔗 BookLib.toOrderId | 🎯#L311 | self.assertUnusedOrderId(orderId)

(storage) BookLib.incrementOrderId(Book).self |
(i) (w) 🔗 BookLib.incrementOrderId | 🎯#L316 | ++ self.metadata.orderIdCounter

(storage) BookLib.setMaxLimitsPerTx(Book,uint8).self |
(i) (r) 🔗 BookLib.setMaxLimitsPerTx | 🎯#L331 | StorageLib.loadBookSettings(self.config.asset).maxLimitsPerTx = newMax

(storage) BookLib.setMinLimitOrderAmountInBase(Book,uint256).self |
(i) (r) 🔗 BookLib.setMinLimitOrderAmountInBase | 🎯#L337 | StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase = newLimitOrderAmountInBase

(storage) BookLib.incrementLimitsPlaced(Book,address).self |
(i) (r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L353 | limitsPlaced == StorageLib.loadBookSettings(self.config.asset).maxLimitsPerTx

(storage) BookLib.addOrderToBook(Book,Order).self |
(i) (w) 🔗 BookLib.addOrderToBook | 🎯#L377 | self.orders[order.id] = order
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L395 | self.metadata.numBids ++
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L396 | self.metadata.quoteOI += order.amount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L400 | self.metadata.numAsks ++
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L401 | self.metadata.baseOI += order.amount
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L406 | limit.numOrders ++
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(i) (r*) 🔗 BookLib.addOrderToBook | 🎯#L369 | StorageLib.loadMarket(self.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 BookLib.addOrderToBook | 🎯#L374 | limit = _updateBookPostOrder(self,order)
(i) (r*) 🔗 BookLib.addOrderToBook | 🎯#L375 | _updateLimitPostOrder(self,limit,order)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | self.bidTree.insert(order.price)
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | self.askTree.insert(order.price)
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount

(storage) BookLib.addOrderToBook(Book,Order).limit | _updateBookPostOrder(self,order)
(i) (w) 🔗 BookLib.addOrderToBook | 🎯#L374 | limit = _updateBookPostOrder(self,order)
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L406 | limit.numOrders ++
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(i) (r*) 🔗 BookLib.addOrderToBook | 🎯#L375 | _updateLimitPostOrder(self,limit,order)
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id

(storage) BookLib.removeOrderFromBook(Book,Order).self |
(i) (w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(i) (w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(i) (w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(i) (w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L447 | limit.numOrders --
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(i) (r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 BookLib.removeOrderFromBook | 🎯#L387 | _updateLimitRemoveOrder(self,order)
(i) (r*) 🔗 BookLib.removeOrderFromBook | 🎯#L388 | _updateBookRemoveOrder(self,order)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(i) (r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(i) (r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L436 | limit.numOrders == 1
(i) (r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(i) (r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount

(storage) BookLib._updateBookPostOrder(Book,Order).self |
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L395 | self.metadata.numBids ++
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L396 | self.metadata.quoteOI += order.amount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L400 | self.metadata.numAsks ++
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L401 | self.metadata.baseOI += order.amount
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | self.bidTree.insert(order.price)
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | self.askTree.insert(order.price)
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount

(storage) BookLib._updateBookPostOrder(Book,Order).limit |
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(i) (w) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(i) (r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0

(storage) BookLib._updateLimitPostOrder(Book,Limit,Order).limit |
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L406 | limit.numOrders ++
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id

(storage) BookLib._updateLimitPostOrder(Book,Limit,Order).self |
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id

(storage) BookLib._updateLimitPostOrder(Book,Limit,Order).tailOrder | self.orders[limit.tailOrder]
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(i) (w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(i) (r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id

(storage) BookLib._updateBookRemoveOrder(Book,Order).self |
(i) (w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(i) (w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(i) (w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(i) (w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.quoteOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
    (🔀?self.metadata.baseOI?)  (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount

(storage) BookLib._updateLimitRemoveOrder(Book,Order).limit | if order.side == Side.BUY then self.bidLimits[order.price] else self.askLimits[order.price]
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | order.side == Side.BUY
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L447 | limit.numOrders --
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L436 | limit.numOrders == 1

(storage) BookLib._updateLimitRemoveOrder(Book,Order).self |
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L447 | limit.numOrders --
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(i) (w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(i) (r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L436 | limit.numOrders == 1
(i) (r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(i) (r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) BookLib._getQuoteLimit(Book,Limit,uint256,uint256).limit |
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L461 | numOrders = limit.numOrders
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L462 | orderId = limit.headOrder
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L465 | i < numOrders
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L467 | orderId.unwrap() == 0
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L469 | fillAmount = self.orders[orderId].amount.min(baseAmount)
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L471 | quoteAmount += fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L472 | baseAmount -= fillAmount
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L473 | baseUsed += fillAmount
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L475 | orderId = self.orders[orderId].nextOrderId

(storage) BookLib._getQuoteLimit(Book,Limit,uint256,uint256).self |
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L467 | orderId.unwrap() == 0
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L469 | fillAmount = self.orders[orderId].amount.min(baseAmount)
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L471 | quoteAmount += fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L472 | baseAmount -= fillAmount
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L473 | baseUsed += fillAmount
(i) (r) 🔗 BookLib._getQuoteLimit | 🎯🟩#L475 | orderId = self.orders[orderId].nextOrderId

(storage) BookLib._getBaseLimit(Book,Limit,uint256,uint256).limit |
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L484 | numOrders = limit.numOrders
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L485 | orderId = limit.headOrder
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L488 | i < numOrders
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L490 | orderId.unwrap() == 0
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L492 | fillAmount = self.orders[orderId].amount.min(quoteAmount.fullMulDiv(1e18,price))
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L494 | baseAmount += fillAmount
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L495 | quoteUsed += fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L496 | quoteAmount -= fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L498 | orderId = self.orders[orderId].nextOrderId

(storage) BookLib._getBaseLimit(Book,Limit,uint256,uint256).self |
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L490 | orderId.unwrap() == 0
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L492 | fillAmount = self.orders[orderId].amount.min(quoteAmount.fullMulDiv(1e18,price))
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L494 | baseAmount += fillAmount
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L495 | quoteUsed += fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L496 | quoteAmount -= fillAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 BookLib._getBaseLimit | 🎯🟩#L498 | orderId = self.orders[orderId].nextOrderId

Solidity Vars Used

msg.sender
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

modifiers_html

functions_html

CLOBLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/CLOBLib.sol#21:1

state_vars_html

(storage) CLOBLib.init(bytes32,BookSettings,uint256).ds | _getStorage(asset,BookType.STANDARD)
(i) (w) 🔗 CLOBLib.init | 🎯#L112 | ds = _getStorage(asset,BookType.STANDARD)
(i) (w) 🔗 CLOBLib.init | 🎯#L120 | ds.config.asset = asset
(i) (w) 🔗 CLOBLib.init | 🎯#L121 | ds.config.bookType = BookType.STANDARD
(i) (w) 🔗 CLOBLib.init | 🎯#L122 | ds.config.lotSize = lotSize
(i) (w) 🔗 CLOBLib.init | 🎯#L124 | ds = _getStorage(asset,BookType.BACKSTOP)
(i) (w) 🔗 CLOBLib.init | 🎯#L126 | ds.config.asset = asset
(i) (w) 🔗 CLOBLib.init | 🎯#L127 | ds.config.bookType = BookType.BACKSTOP
(i) (w) 🔗 CLOBLib.init | 🎯#L128 | ds.config.lotSize = lotSize
    (🔀?ds.config.asset?)  (w) 🔗 MarketLib.init | 🎯#L106 | self.asset = asset
    (🔀?ds.config.asset?)  (w) 🔗 MarketLib.init | 🎯#L106 | self.asset = asset

(storage) CLOBLib.init(bytes32,BookSettings,uint256).dsSettings | StorageLib.loadBookSettings(asset)
(i) (w) 🔗 CLOBLib.init | 🎯#L113 | dsSettings = StorageLib.loadBookSettings(asset)
(i) (w) 🔗 CLOBLib.init | 🎯#L115 | dsSettings.maxNumOrders = bookSettings.maxNumOrders
(i) (w) 🔗 CLOBLib.init | 🎯#L116 | dsSettings.maxLimitsPerTx = bookSettings.maxLimitsPerTx
(i) (w) 🔗 CLOBLib.init | 🎯#L117 | dsSettings.minLimitOrderAmountInBase = bookSettings.minLimitOrderAmountInBase
(i) (w) 🔗 CLOBLib.init | 🎯#L118 | dsSettings.tickSize = bookSettings.tickSize
    (🔀?dsSettings.maxNumOrders?)  (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L686 | bookSettings.maxNumOrders = settings.maxNumOrders
    (🔀?dsSettings.maxLimitsPerTx?)  (w) 🔗 CLOBStorageLib.init | 🎯#L544 | ss.maxLimitsPerTx = marketSettings.maxLimitsPerTx
    (🔀?dsSettings.maxLimitsPerTx?)  (w) 🔗 CLOBStorageLib.init | 🎯#L544 | ss.maxLimitsPerTx = marketSettings.maxLimitsPerTx
    (🔀?dsSettings.maxLimitsPerTx?)  (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L687 | bookSettings.maxLimitsPerTx = settings.maxLimitsPerTx
    (🔀?dsSettings.minLimitOrderAmountInBase?)  (w) 🔗 CLOBStorageLib.init | 🎯#L545 | ss.minLimitOrderAmountInBase = marketSettings.minLimitOrderAmountInBase
    (🔀?dsSettings.minLimitOrderAmountInBase?)  (w) 🔗 CLOBStorageLib.init | 🎯#L545 | ss.minLimitOrderAmountInBase = marketSettings.minLimitOrderAmountInBase
    (🔀?dsSettings.minLimitOrderAmountInBase?)  (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L688 | bookSettings.minLimitOrderAmountInBase = settings.minLimitOrderAmountInBase
    (🔀?dsSettings.tickSize?)  (w) 🔗 CLOBStorageLib.init | 🎯#L546 | ss.tickSize = marketSettings.tickSize
    (🔀?dsSettings.tickSize?)  (w) 🔗 CLOBStorageLib.init | 🎯#L546 | ss.tickSize = marketSettings.tickSize
    (🔀?dsSettings.tickSize?)  (w) 🔗 AdminPanel.setBookSettings | 🎯💥❌ ['onlyAdmin']#L689 | bookSettings.tickSize = settings.tickSize

(storage) CLOBLib.placeOrder(address,PlaceOrderArgs,BookType).ds | _getStorage(args.asset,bookType)
(w) 🔗 BookLib.addOrderToBook | 🎯#L377 | self.orders[order.id] = order
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L395 | self.metadata.numBids ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L396 | self.metadata.quoteOI += order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L400 | self.metadata.numAsks ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L401 | self.metadata.baseOI += order.amount
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib.placeOrder | 🎯#L141 | ds = _getStorage(args.asset,bookType)
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.addOrderToBook | 🎯#L369 | StorageLib.loadMarket(self.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L374 | limit = _updateBookPostOrder(self,order)
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib.placeOrder | 🎯#L149 | orderId = ds.toOrderId(account,args.clientOrderId)
(i) (r*) 🔗 CLOBLib.placeOrder | 🎯#L152 | result = _processBuyOrder(ds,newOrder,args)
(i) (r*) 🔗 CLOBLib.placeOrder | 🎯#L153 | result = _processSellOrder(ds,newOrder,args)
(i) (r*) 🔗 CLOBLib.placeOrder | 🎯#L158 | _updateOrderbookNotional(args.asset,account,args.subaccount,result.basePosted.fullMulDiv(newOrder.price,1e18).toInt256())
(i) (r*) 🔗 CLOBLib._processBuyOrder | 🎯#L208 | (result.quoteTraded,result.baseTraded) = _executeBuyOrder(ds,newOrder,args.tif,args.baseDenominated)
(i) (r*) 🔗 CLOBLib._processSellOrder | 🎯#L220 | (result.quoteTraded,result.baseTraded) = _executeSellOrder(ds,newOrder,args.tif,args.baseDenominated)
(i) (r*) 🔗 CLOBLib._executeBuyOrder | 🎯#L233 | (quoteSent,baseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._executeSellOrder | 🎯#L278 | (quoteReceived,baseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L358 | data = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L389 | data = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.assertUnusedOrderId | 🎯🟩#L105 | self.orders[orderId.wrap()].owner != address(0)
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib.boundToLots | 🎯🟩#L176 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L186 | postableBaseAmount = self.boundToLots(baseAmount)
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L188 | postableBaseAmount < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L353 | limitsPlaced == StorageLib.loadBookSettings(self.config.asset).maxLimitsPerTx
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(r) 🔗 BookLib.assertPriceInBounds | 🎯🟩#L90 | price % StorageLib.loadBookSettings(self.config.asset).tickSize != 0
(i) (r) 🔗 CLOBLib.placeOrder | 🎯#L146 | ds.assertPriceInBounds(args.limitPrice)
(i) (r) 🔗 CLOBLib.placeOrder | 🎯#L150 | newOrder = args.toOrder(orderId,account)
(i) (r) 🔗 CLOBLib.placeOrder | 🎯#L155 | result.baseTraded + result.quoteTraded + result.basePosted == 0
(i) (r) 🔗 CLOBLib.placeOrder | 🎯#L157 | ! args.reduceOnly && result.basePosted > 0
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L231 | ds.getBestAsk() <= newOrder.price
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L249 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L253 | ds.metadata.numBids < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L257 | ds.metadata.numBids == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price > ds.getMinBidPrice()
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L261 | removeOrder = ds.orders[ds.bidLimits[ds.getMinBidPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L276 | ds.getBestBid() >= newOrder.price
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L294 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L298 | ds.metadata.numAsks < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L301 | ds.metadata.numAsks == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price < ds.getMaxAskPrice()
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L304 | removeOrder = ds.orders[ds.askLimits[ds.getMaxAskPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L342 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L343 | maxAsk = StorageLib.loadMarket(ds.config.asset).getMaxDivergingAskPrice()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L345 | bestAsk <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L346 | bestAsk == type()(uint256).max
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L347 | bestAsk > maxAsk
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L349 | limit = ds.askLimits[bestAsk]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L350 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L352 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L354 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L360 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L362 | baseReceived += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L363 | quoteSent += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L373 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L374 | minBid = StorageLib.loadMarket(ds.config.asset).getMaxDivergingBidPrice()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L376 | bestBid >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L378 | bestBid < minBid
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L380 | limit = ds.bidLimits[bestBid]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L381 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L383 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L385 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L391 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L393 | totalQuoteTokenReceived += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L394 | totalBaseTokenSent += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
(r) 🔗 MarketLib.getMaxDivergingBidPrice | 🎯🟩#L409 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib.getMaxDivergingAskPrice | 🎯🟩#L416 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib.amend(address,AmendLimitOrderArgs,BookType).ds | _getStorage(args.asset,bookType)
(w) 🔗 BookLib.addOrderToBook | 🎯#L377 | self.orders[order.id] = order
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L395 | self.metadata.numBids ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L396 | self.metadata.quoteOI += order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L400 | self.metadata.numAsks ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L401 | self.metadata.baseOI += order.amount
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib.amend | 🎯#L171 | ds = _getStorage(args.asset,bookType)
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L608 | order.reduceOnly = args.reduceOnly
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L609 | order.expiryTime = args.expiryTime
(w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.addOrderToBook | 🎯#L369 | StorageLib.loadMarket(self.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L374 | limit = _updateBookPostOrder(self,order)
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib.amend | 🎯#L182 | (notionalDelta,collateralDelta) = _processAmend(ds,order,args)
(i) (r*) 🔗 CLOBLib._executeBuyOrder | 🎯#L233 | (quoteSent,baseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._executeSellOrder | 🎯#L278 | (quoteReceived,baseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L358 | data = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L389 | data = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r*) 🔗 CLOBLib._processAmend | 🎯#L526 | _executeAmendNewOrder(ds,order,args)
(i) (r*) 🔗 CLOBLib._processAmend | 🎯#L529 | _executeAmendAmount(ds,order,args)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L549 | ds.removeOrderFromBook(order)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L552 | _executeBuyOrder(ds,newOrder,TiF.MOC,true)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L553 | _executeSellOrder(ds,newOrder,TiF.MOC,true)
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L597 | StorageLib.loadMarket(ds.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L601 | StorageLib.loadMarket(ds.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.assertLimitOrderAmountInBounds | 🎯🟩#L101 | orderAmountInBase % self.config.lotSize != 0
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib.boundToLots | 🎯🟩#L176 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L186 | postableBaseAmount = self.boundToLots(baseAmount)
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L188 | postableBaseAmount < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L353 | limitsPlaced == StorageLib.loadBookSettings(self.config.asset).maxLimitsPerTx
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L83 | tickSize = StorageLib.loadBookSettings(self.config.asset).tickSize
(r) 🔗 BookLib.assertLimitPriceInBounds | 🎯🟩#L85 | price == 0 || price % tickSize != 0
(r) 🔗 BookLib.assertLimitOrderAmountInBounds | 🎯🟩#L98 | orderAmountInBase < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase
(i) (r) 🔗 CLOBLib.amend | 🎯#L172 | order = ds.orders[args.orderId.wrap()]
(i) (r) 🔗 CLOBLib.amend | 🎯#L174 | order.id.unwrap() == 0
(i) (r) 🔗 CLOBLib.amend | 🎯#L175 | order.owner != account
(i) (r) 🔗 CLOBLib.amend | 🎯#L176 | order.subaccount != args.subaccount
(i) (r) 🔗 CLOBLib.amend | 🎯#L178 | ds.assertLimitPriceInBounds(args.price)
(i) (r) 🔗 CLOBLib.amend | 🎯#L179 | ds.assertLimitOrderAmountInBounds(args.baseAmount)
(i) (r) 🔗 CLOBLib.amend | 🎯#L186 | OrderAmended(args.asset,args.orderId,order,collateralDelta,ds.config.bookType,StorageLib.incNonce())
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L231 | ds.getBestAsk() <= newOrder.price
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L249 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L253 | ds.metadata.numBids < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L257 | ds.metadata.numBids == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price > ds.getMinBidPrice()
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L261 | removeOrder = ds.orders[ds.bidLimits[ds.getMinBidPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L276 | ds.getBestBid() >= newOrder.price
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L294 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L298 | ds.metadata.numAsks < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L301 | ds.metadata.numAsks == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price < ds.getMaxAskPrice()
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L304 | removeOrder = ds.orders[ds.askLimits[ds.getMaxAskPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L342 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L343 | maxAsk = StorageLib.loadMarket(ds.config.asset).getMaxDivergingAskPrice()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L345 | bestAsk <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L346 | bestAsk == type()(uint256).max
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L347 | bestAsk > maxAsk
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L349 | limit = ds.askLimits[bestAsk]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L350 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L352 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L354 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L360 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L362 | baseReceived += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L363 | quoteSent += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L373 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L374 | minBid = StorageLib.loadMarket(ds.config.asset).getMaxDivergingBidPrice()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L376 | bestBid >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L378 | bestBid < minBid
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L380 | limit = ds.bidLimits[bestBid]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L381 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L383 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L385 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L391 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L393 | totalQuoteTokenReceived += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L394 | totalBaseTokenSent += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
(i) (r) 🔗 CLOBLib._processAmend | 🎯#L520 | args.expiryTime.isExpired() || args.baseAmount < StorageLib.loadBookSettings(ds.config.asset).minLimitOrderAmountInBase
(i) (r) 🔗 CLOBLib._processAmend | 🎯#L524 | order.side != args.side || order.price != args.price
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L538 | newOrder = args.toOrder(order)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L540 | leverage = _getLeverage(args.asset,newOrder.owner,newOrder.subaccount)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L542 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L543 | orderNotional = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L545 | notionalDelta -= orderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L546 | collateralDelta -= orderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L555 | ! newOrder.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L556 | orderNotional_scope_0 = newOrder.amount.fullMulDiv(newOrder.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L558 | notionalDelta += orderNotional_scope_0.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L559 | collateralDelta += orderNotional_scope_0.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L568 | price = order.price
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L569 | newQuoteAmount = args.baseAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L570 | oldQuoteAmount = order.amount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L571 | leverage = _getLeverage(args.asset,order.owner,args.subaccount)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L573 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L574 | orderNotional = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L575 | notionalDelta -= orderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L576 | collateralDelta -= orderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L580 | newOrderNotional = args.baseAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L581 | notionalDelta += newOrderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L582 | collateralDelta += newOrderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L585 | order.side == Side.BUY
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L586 | quoteDelta = oldQuoteAmount.toInt256() - newQuoteAmount.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L590 | baseDelta = order.amount.toInt256() - args.baseAmount.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L595 | order.reduceOnly != args.reduceOnly
(r) 🔗 MarketLib.getMaxDivergingBidPrice | 🎯🟩#L409 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib.getMaxDivergingAskPrice | 🎯🟩#L416 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 OrderLib.toOrder | 🎯🟩#L80 | newOrder.owner = currentOrder.owner
(r) 🔗 OrderLib.toOrder | 🎯🟩#L81 | newOrder.id = currentOrder.id
(r) 🔗 OrderLib.toOrder | 🎯🟩#L86 | newOrder.subaccount = currentOrder.subaccount
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib.amend(address,AmendLimitOrderArgs,BookType).order | ds.orders[args.orderId.wrap()]
(i) (w) 🔗 CLOBLib.amend | 🎯#L172 | order = ds.orders[args.orderId.wrap()]
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L608 | order.reduceOnly = args.reduceOnly
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L609 | order.expiryTime = args.expiryTime
(i) (r*) 🔗 CLOBLib.amend | 🎯#L182 | (notionalDelta,collateralDelta) = _processAmend(ds,order,args)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L552 | _executeBuyOrder(ds,newOrder,TiF.MOC,true)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L553 | _executeSellOrder(ds,newOrder,TiF.MOC,true)
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L597 | StorageLib.loadMarket(ds.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L601 | StorageLib.loadMarket(ds.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(i) (r) 🔗 CLOBLib.amend | 🎯#L174 | order.id.unwrap() == 0
(i) (r) 🔗 CLOBLib.amend | 🎯#L175 | order.owner != account
(i) (r) 🔗 CLOBLib.amend | 🎯#L176 | order.subaccount != args.subaccount
(i) (r) 🔗 CLOBLib.amend | 🎯#L186 | OrderAmended(args.asset,args.orderId,order,collateralDelta,ds.config.bookType,StorageLib.incNonce())
(i) (r) 🔗 CLOBLib._processAmend | 🎯#L524 | order.side != args.side || order.price != args.price
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L538 | newOrder = args.toOrder(order)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L540 | leverage = _getLeverage(args.asset,newOrder.owner,newOrder.subaccount)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L542 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L543 | orderNotional = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L545 | notionalDelta -= orderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L546 | collateralDelta -= orderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L555 | ! newOrder.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L556 | orderNotional_scope_0 = newOrder.amount.fullMulDiv(newOrder.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L558 | notionalDelta += orderNotional_scope_0.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L559 | collateralDelta += orderNotional_scope_0.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L568 | price = order.price
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L569 | newQuoteAmount = args.baseAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L570 | oldQuoteAmount = order.amount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L571 | leverage = _getLeverage(args.asset,order.owner,args.subaccount)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L573 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L574 | orderNotional = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L575 | notionalDelta -= orderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L576 | collateralDelta -= orderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L580 | newOrderNotional = args.baseAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L581 | notionalDelta += newOrderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L582 | collateralDelta += newOrderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L585 | order.side == Side.BUY
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L586 | quoteDelta = oldQuoteAmount.toInt256() - newQuoteAmount.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L590 | baseDelta = order.amount.toInt256() - args.baseAmount.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L595 | order.reduceOnly != args.reduceOnly
(r) 🔗 OrderLib.toOrder | 🎯🟩#L80 | newOrder.owner = currentOrder.owner
(r) 🔗 OrderLib.toOrder | 🎯🟩#L81 | newOrder.id = currentOrder.id
(r) 🔗 OrderLib.toOrder | 🎯🟩#L86 | newOrder.subaccount = currentOrder.subaccount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib.cancel(bytes32,address,uint256,uint256[],BookType).ds | _getStorage(asset,bookType)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib.cancel | 🎯#L193 | ds = _getStorage(asset,bookType)
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib.cancel | 🎯#L195 | collateralRefunded = _executeCancel(ds,account,subaccount,orderIds)
(i) (r*) 🔗 CLOBLib._executeCancel | 🎯#L486 | _updateOrderbookNotional(asset,account,subaccount,- quoteAmount.toInt256())
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L463 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L464 | bookType = ds.config.bookType
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L470 | order = ds.orders[orderId.wrap()]
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L473 | order.isNull()
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L476 | order.owner != account
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L478 | order.subaccount != subaccount
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L483 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L484 | quoteAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L485 | collateralRefunded = quoteAmount.fullMulDiv(1e18,_getLeverage(asset,account,subaccount))
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L491 | totalCollateralRefunded += collateralRefunded
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOBLib._processBuyOrder(Book,Order,PlaceOrderArgs).ds |
(w) 🔗 BookLib.addOrderToBook | 🎯#L377 | self.orders[order.id] = order
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L395 | self.metadata.numBids ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L396 | self.metadata.quoteOI += order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L400 | self.metadata.numAsks ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L401 | self.metadata.baseOI += order.amount
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.addOrderToBook | 🎯#L369 | StorageLib.loadMarket(self.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L374 | limit = _updateBookPostOrder(self,order)
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._processBuyOrder | 🎯#L208 | (result.quoteTraded,result.baseTraded) = _executeBuyOrder(ds,newOrder,args.tif,args.baseDenominated)
(i) (r*) 🔗 CLOBLib._executeBuyOrder | 🎯#L233 | (quoteSent,baseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L358 | data = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib.boundToLots | 🎯🟩#L176 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L186 | postableBaseAmount = self.boundToLots(baseAmount)
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L188 | postableBaseAmount < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L353 | limitsPlaced == StorageLib.loadBookSettings(self.config.asset).maxLimitsPerTx
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L231 | ds.getBestAsk() <= newOrder.price
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L249 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L253 | ds.metadata.numBids < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L257 | ds.metadata.numBids == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price > ds.getMinBidPrice()
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L261 | removeOrder = ds.orders[ds.bidLimits[ds.getMinBidPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L342 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L343 | maxAsk = StorageLib.loadMarket(ds.config.asset).getMaxDivergingAskPrice()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L345 | bestAsk <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L346 | bestAsk == type()(uint256).max
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L347 | bestAsk > maxAsk
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L349 | limit = ds.askLimits[bestAsk]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L350 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L352 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L354 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L360 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L362 | baseReceived += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L363 | quoteSent += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
(r) 🔗 MarketLib.getMaxDivergingAskPrice | 🎯🟩#L416 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._processSellOrder(Book,Order,PlaceOrderArgs).ds |
(w) 🔗 BookLib.addOrderToBook | 🎯#L377 | self.orders[order.id] = order
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L395 | self.metadata.numBids ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L396 | self.metadata.quoteOI += order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L400 | self.metadata.numAsks ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L401 | self.metadata.baseOI += order.amount
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.addOrderToBook | 🎯#L369 | StorageLib.loadMarket(self.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L374 | limit = _updateBookPostOrder(self,order)
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._processSellOrder | 🎯#L220 | (result.quoteTraded,result.baseTraded) = _executeSellOrder(ds,newOrder,args.tif,args.baseDenominated)
(i) (r*) 🔗 CLOBLib._executeSellOrder | 🎯#L278 | (quoteReceived,baseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L389 | data = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib.boundToLots | 🎯🟩#L176 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L186 | postableBaseAmount = self.boundToLots(baseAmount)
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L188 | postableBaseAmount < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L353 | limitsPlaced == StorageLib.loadBookSettings(self.config.asset).maxLimitsPerTx
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L276 | ds.getBestBid() >= newOrder.price
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L294 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L298 | ds.metadata.numAsks < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L301 | ds.metadata.numAsks == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price < ds.getMaxAskPrice()
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L304 | removeOrder = ds.orders[ds.askLimits[ds.getMaxAskPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L373 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L374 | minBid = StorageLib.loadMarket(ds.config.asset).getMaxDivergingBidPrice()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L376 | bestBid >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L378 | bestBid < minBid
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L380 | limit = ds.bidLimits[bestBid]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L381 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L383 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L385 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L391 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L393 | totalQuoteTokenReceived += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L394 | totalBaseTokenSent += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
(r) 🔗 MarketLib.getMaxDivergingBidPrice | 🎯🟩#L409 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._executeBuyOrder(Book,Order,TiF,bool).ds |
(w) 🔗 BookLib.addOrderToBook | 🎯#L377 | self.orders[order.id] = order
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L395 | self.metadata.numBids ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L396 | self.metadata.quoteOI += order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L400 | self.metadata.numAsks ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L401 | self.metadata.baseOI += order.amount
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.addOrderToBook | 🎯#L369 | StorageLib.loadMarket(self.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L374 | limit = _updateBookPostOrder(self,order)
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._executeBuyOrder | 🎯#L233 | (quoteSent,baseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._executeBuyOrder | 🎯#L255 | ds.addOrderToBook(newOrder)
(i) (r*) 🔗 CLOBLib._executeBuyOrder | 🎯#L263 | _removeUnfillableOrder(ds,removeOrder)
(i) (r*) 🔗 CLOBLib._executeBuyOrder | 🎯#L265 | ds.addOrderToBook(newOrder)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L334 | ds.removeOrderFromBook(order)
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L358 | data = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib.boundToLots | 🎯🟩#L176 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L186 | postableBaseAmount = self.boundToLots(baseAmount)
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L188 | postableBaseAmount < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L353 | limitsPlaced == StorageLib.loadBookSettings(self.config.asset).maxLimitsPerTx
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L231 | ds.getBestAsk() <= newOrder.price
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L243 | ds.incrementLimitsPlaced(msg.sender)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L249 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L253 | ds.metadata.numBids < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L257 | ds.metadata.numBids == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price > ds.getMinBidPrice()
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L261 | removeOrder = ds.orders[ds.bidLimits[ds.getMinBidPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L342 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L343 | maxAsk = StorageLib.loadMarket(ds.config.asset).getMaxDivergingAskPrice()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L345 | bestAsk <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L346 | bestAsk == type()(uint256).max
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L347 | bestAsk > maxAsk
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L349 | limit = ds.askLimits[bestAsk]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L350 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L352 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L354 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L360 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L362 | baseReceived += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L363 | quoteSent += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
(r) 🔗 MarketLib.getMaxDivergingAskPrice | 🎯🟩#L416 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._executeBuyOrder(Book,Order,TiF,bool).removeOrder | ds.orders[ds.bidLimits[ds.getMinBidPrice()].tailOrder]
(i) (w) 🔗 CLOBLib._executeBuyOrder | 🎯#L261 | removeOrder = ds.orders[ds.bidLimits[ds.getMinBidPrice()].tailOrder]
(i) (r*) 🔗 CLOBLib._executeBuyOrder | 🎯#L263 | _removeUnfillableOrder(ds,removeOrder)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))

(storage) CLOBLib._executeSellOrder(Book,Order,TiF,bool).ds |
(w) 🔗 BookLib.addOrderToBook | 🎯#L377 | self.orders[order.id] = order
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L395 | self.metadata.numBids ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L396 | self.metadata.quoteOI += order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L400 | self.metadata.numAsks ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L401 | self.metadata.baseOI += order.amount
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.addOrderToBook | 🎯#L369 | StorageLib.loadMarket(self.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L374 | limit = _updateBookPostOrder(self,order)
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._executeSellOrder | 🎯#L278 | (quoteReceived,baseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._executeSellOrder | 🎯#L299 | ds.addOrderToBook(newOrder)
(i) (r*) 🔗 CLOBLib._executeSellOrder | 🎯#L306 | _removeUnfillableOrder(ds,removeOrder)
(i) (r*) 🔗 CLOBLib._executeSellOrder | 🎯#L308 | ds.addOrderToBook(newOrder)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L334 | ds.removeOrderFromBook(order)
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L389 | data = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib.boundToLots | 🎯🟩#L176 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L186 | postableBaseAmount = self.boundToLots(baseAmount)
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L188 | postableBaseAmount < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L353 | limitsPlaced == StorageLib.loadBookSettings(self.config.asset).maxLimitsPerTx
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L276 | ds.getBestBid() >= newOrder.price
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L288 | ds.incrementLimitsPlaced(msg.sender)
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L294 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L298 | ds.metadata.numAsks < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L301 | ds.metadata.numAsks == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price < ds.getMaxAskPrice()
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L304 | removeOrder = ds.orders[ds.askLimits[ds.getMaxAskPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L373 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L374 | minBid = StorageLib.loadMarket(ds.config.asset).getMaxDivergingBidPrice()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L376 | bestBid >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L378 | bestBid < minBid
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L380 | limit = ds.bidLimits[bestBid]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L381 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L383 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L385 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L391 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L393 | totalQuoteTokenReceived += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L394 | totalBaseTokenSent += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
(r) 🔗 MarketLib.getMaxDivergingBidPrice | 🎯🟩#L409 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._executeSellOrder(Book,Order,TiF,bool).removeOrder | ds.orders[ds.askLimits[ds.getMaxAskPrice()].tailOrder]
(i) (w) 🔗 CLOBLib._executeSellOrder | 🎯#L304 | removeOrder = ds.orders[ds.askLimits[ds.getMaxAskPrice()].tailOrder]
(i) (r*) 🔗 CLOBLib._executeSellOrder | 🎯#L306 | _removeUnfillableOrder(ds,removeOrder)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))

(storage) CLOBLib._removeUnfillableOrder(Book,Order).order |
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L334 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))

(storage) CLOBLib._matchIncomingBid(Book,Order,bool).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L334 | ds.removeOrderFromBook(order)
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L353 | _removeUnfillableOrder(ds,bestAskOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L358 | data = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L409 | _removeUnfillableOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | _boundReduceOnlyOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L442 | _removeUnfillableOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L455 | ds.removeOrderFromBook(matchedOrder)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L342 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L343 | maxAsk = StorageLib.loadMarket(ds.config.asset).getMaxDivergingAskPrice()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L345 | bestAsk <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L346 | bestAsk == type()(uint256).max
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L347 | bestAsk > maxAsk
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L349 | limit = ds.askLimits[bestAsk]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L350 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L352 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L354 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L360 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L362 | baseReceived += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L363 | quoteSent += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
(r) 🔗 MarketLib.getMaxDivergingAskPrice | 🎯🟩#L416 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._matchIncomingAsk(Book,Order,bool).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L334 | ds.removeOrderFromBook(order)
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L384 | _removeUnfillableOrder(ds,bestBidOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L389 | data = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L409 | _removeUnfillableOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | _boundReduceOnlyOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L442 | _removeUnfillableOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L455 | ds.removeOrderFromBook(matchedOrder)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L373 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L374 | minBid = StorageLib.loadMarket(ds.config.asset).getMaxDivergingBidPrice()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L376 | bestBid >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L378 | bestBid < minBid
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L380 | limit = ds.bidLimits[bestBid]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L381 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L383 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L385 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L391 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L393 | totalQuoteTokenReceived += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L394 | totalBaseTokenSent += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
(r) 🔗 MarketLib.getMaxDivergingBidPrice | 🎯🟩#L409 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._removeUnfillableOrder(Book,Order).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L334 | ds.removeOrderFromBook(order)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L328 | OrderCanceled(asset,orderId,owner,subaccount,collateralRefund,ds.config.bookType,StorageLib.incNonce())
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOBLib._matchIncomingBid(Book,Order,bool).limit | ds.askLimits[bestAsk]
(i) (w) 🔗 CLOBLib._matchIncomingBid | 🎯#L349 | limit = ds.askLimits[bestAsk]
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L358 | data = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L350 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L352 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L360 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L362 | baseReceived += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L363 | quoteSent += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._matchIncomingBid(Book,Order,bool).bestAskOrder | ds.orders[limit.headOrder]
(i) (w) 🔗 CLOBLib._matchIncomingBid | 🎯#L350 | bestAskOrder = ds.orders[limit.headOrder]
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L353 | _removeUnfillableOrder(ds,bestAskOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L358 | data = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L352 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L360 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L362 | baseReceived += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L363 | quoteSent += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._matchIncomingAsk(Book,Order,bool).limit | ds.bidLimits[bestBid]
(i) (w) 🔗 CLOBLib._matchIncomingAsk | 🎯#L380 | limit = ds.bidLimits[bestBid]
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L389 | data = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L381 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L383 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L391 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L393 | totalQuoteTokenReceived += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L394 | totalBaseTokenSent += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._matchIncomingAsk(Book,Order,bool).bestBidOrder | ds.orders[limit.headOrder]
(i) (w) 🔗 CLOBLib._matchIncomingAsk | 🎯#L381 | bestBidOrder = ds.orders[limit.headOrder]
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L384 | _removeUnfillableOrder(ds,bestBidOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L389 | data = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L383 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L391 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L393 | totalQuoteTokenReceived += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L394 | totalBaseTokenSent += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._matchIncomingOrder(Book,Order,Order,bool).matchedOrder |
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L409 | _removeUnfillableOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | _boundReduceOnlyOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L442 | _removeUnfillableOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L455 | ds.removeOrderFromBook(matchedOrder)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._matchIncomingOrder(Book,Order,Order,bool).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L409 | _removeUnfillableOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | _boundReduceOnlyOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L442 | _removeUnfillableOrder(ds,matchedOrder)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L455 | ds.removeOrderFromBook(matchedOrder)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._executeCancel(Book,address,uint256,uint256[]).ds |
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._executeCancel | 🎯#L486 | _updateOrderbookNotional(asset,account,subaccount,- quoteAmount.toInt256())
(i) (r*) 🔗 CLOBLib._executeCancel | 🎯#L493 | ds.removeOrderFromBook(order)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L463 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L464 | bookType = ds.config.bookType
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L470 | order = ds.orders[orderId.wrap()]
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L473 | order.isNull()
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L476 | order.owner != account
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L478 | order.subaccount != subaccount
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L483 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L484 | quoteAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L485 | collateralRefunded = quoteAmount.fullMulDiv(1e18,_getLeverage(asset,account,subaccount))
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L491 | totalCollateralRefunded += collateralRefunded
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) CLOBLib._executeCancel(Book,address,uint256,uint256[]).order | ds.orders[orderId.wrap()]
(i) (w) 🔗 CLOBLib._executeCancel | 🎯#L470 | order = ds.orders[orderId.wrap()]
(i) (r*) 🔗 CLOBLib._executeCancel | 🎯#L486 | _updateOrderbookNotional(asset,account,subaccount,- quoteAmount.toInt256())
(i) (r*) 🔗 CLOBLib._executeCancel | 🎯#L493 | ds.removeOrderFromBook(order)
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L473 | order.isNull()
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L476 | order.owner != account
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L478 | order.subaccount != subaccount
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L483 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L484 | quoteAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L485 | collateralRefunded = quoteAmount.fullMulDiv(1e18,_getLeverage(asset,account,subaccount))
(i) (r) 🔗 CLOBLib._executeCancel | 🎯#L491 | totalCollateralRefunded += collateralRefunded

(storage) CLOBLib._boundReduceOnlyOrder(Book,Order).ds |
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._boundReduceOnlyOrder(Book,Order).order |
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._processAmend(Book,Order,AmendLimitOrderArgs).ds |
(w) 🔗 BookLib.addOrderToBook | 🎯#L377 | self.orders[order.id] = order
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L395 | self.metadata.numBids ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L396 | self.metadata.quoteOI += order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L400 | self.metadata.numAsks ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L401 | self.metadata.baseOI += order.amount
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
(w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.addOrderToBook | 🎯#L369 | StorageLib.loadMarket(self.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L374 | limit = _updateBookPostOrder(self,order)
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._executeBuyOrder | 🎯#L233 | (quoteSent,baseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._executeSellOrder | 🎯#L278 | (quoteReceived,baseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L358 | data = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L389 | data = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r*) 🔗 CLOBLib._processAmend | 🎯#L526 | _executeAmendNewOrder(ds,order,args)
(i) (r*) 🔗 CLOBLib._processAmend | 🎯#L529 | _executeAmendAmount(ds,order,args)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L552 | _executeBuyOrder(ds,newOrder,TiF.MOC,true)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L553 | _executeSellOrder(ds,newOrder,TiF.MOC,true)
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L597 | StorageLib.loadMarket(ds.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L601 | StorageLib.loadMarket(ds.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib.boundToLots | 🎯🟩#L176 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L186 | postableBaseAmount = self.boundToLots(baseAmount)
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L188 | postableBaseAmount < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L353 | limitsPlaced == StorageLib.loadBookSettings(self.config.asset).maxLimitsPerTx
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L231 | ds.getBestAsk() <= newOrder.price
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L249 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L253 | ds.metadata.numBids < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L257 | ds.metadata.numBids == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price > ds.getMinBidPrice()
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L261 | removeOrder = ds.orders[ds.bidLimits[ds.getMinBidPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L276 | ds.getBestBid() >= newOrder.price
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L294 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L298 | ds.metadata.numAsks < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L301 | ds.metadata.numAsks == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price < ds.getMaxAskPrice()
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L304 | removeOrder = ds.orders[ds.askLimits[ds.getMaxAskPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L342 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L343 | maxAsk = StorageLib.loadMarket(ds.config.asset).getMaxDivergingAskPrice()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L345 | bestAsk <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L346 | bestAsk == type()(uint256).max
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L347 | bestAsk > maxAsk
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L349 | limit = ds.askLimits[bestAsk]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L350 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L352 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L354 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L360 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L362 | baseReceived += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L363 | quoteSent += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L373 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L374 | minBid = StorageLib.loadMarket(ds.config.asset).getMaxDivergingBidPrice()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L376 | bestBid >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L378 | bestBid < minBid
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L380 | limit = ds.bidLimits[bestBid]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L381 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L383 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L385 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L391 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L393 | totalQuoteTokenReceived += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L394 | totalBaseTokenSent += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
(i) (r) 🔗 CLOBLib._processAmend | 🎯#L520 | args.expiryTime.isExpired() || args.baseAmount < StorageLib.loadBookSettings(ds.config.asset).minLimitOrderAmountInBase
(r) 🔗 MarketLib.getMaxDivergingBidPrice | 🎯🟩#L409 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib.getMaxDivergingAskPrice | 🎯🟩#L416 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._processAmend(Book,Order,AmendLimitOrderArgs).order |
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L608 | order.reduceOnly = args.reduceOnly
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L609 | order.expiryTime = args.expiryTime
(i) (r*) 🔗 CLOBLib._processAmend | 🎯#L526 | _executeAmendNewOrder(ds,order,args)
(i) (r*) 🔗 CLOBLib._processAmend | 🎯#L529 | _executeAmendAmount(ds,order,args)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L552 | _executeBuyOrder(ds,newOrder,TiF.MOC,true)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L553 | _executeSellOrder(ds,newOrder,TiF.MOC,true)
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L597 | StorageLib.loadMarket(ds.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L601 | StorageLib.loadMarket(ds.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(i) (r) 🔗 CLOBLib._processAmend | 🎯#L524 | order.side != args.side || order.price != args.price
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L538 | newOrder = args.toOrder(order)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L540 | leverage = _getLeverage(args.asset,newOrder.owner,newOrder.subaccount)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L542 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L543 | orderNotional = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L545 | notionalDelta -= orderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L546 | collateralDelta -= orderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L555 | ! newOrder.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L556 | orderNotional_scope_0 = newOrder.amount.fullMulDiv(newOrder.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L558 | notionalDelta += orderNotional_scope_0.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L559 | collateralDelta += orderNotional_scope_0.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L568 | price = order.price
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L569 | newQuoteAmount = args.baseAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L570 | oldQuoteAmount = order.amount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L571 | leverage = _getLeverage(args.asset,order.owner,args.subaccount)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L573 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L574 | orderNotional = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L575 | notionalDelta -= orderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L576 | collateralDelta -= orderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L580 | newOrderNotional = args.baseAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L581 | notionalDelta += newOrderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L582 | collateralDelta += newOrderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L585 | order.side == Side.BUY
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L586 | quoteDelta = oldQuoteAmount.toInt256() - newQuoteAmount.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L590 | baseDelta = order.amount.toInt256() - args.baseAmount.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L595 | order.reduceOnly != args.reduceOnly
(r) 🔗 OrderLib.toOrder | 🎯🟩#L80 | newOrder.owner = currentOrder.owner
(r) 🔗 OrderLib.toOrder | 🎯🟩#L81 | newOrder.id = currentOrder.id
(r) 🔗 OrderLib.toOrder | 🎯🟩#L86 | newOrder.subaccount = currentOrder.subaccount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._executeAmendNewOrder(Book,Order,AmendLimitOrderArgs).order |
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L549 | ds.removeOrderFromBook(order)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L552 | _executeBuyOrder(ds,newOrder,TiF.MOC,true)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L553 | _executeSellOrder(ds,newOrder,TiF.MOC,true)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L538 | newOrder = args.toOrder(order)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L540 | leverage = _getLeverage(args.asset,newOrder.owner,newOrder.subaccount)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L542 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L543 | orderNotional = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L545 | notionalDelta -= orderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L546 | collateralDelta -= orderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L555 | ! newOrder.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L556 | orderNotional_scope_0 = newOrder.amount.fullMulDiv(newOrder.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L558 | notionalDelta += orderNotional_scope_0.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L559 | collateralDelta += orderNotional_scope_0.fullMulDiv(1e18,leverage).toInt256()
(r) 🔗 OrderLib.toOrder | 🎯🟩#L80 | newOrder.owner = currentOrder.owner
(r) 🔗 OrderLib.toOrder | 🎯🟩#L81 | newOrder.id = currentOrder.id
(r) 🔗 OrderLib.toOrder | 🎯🟩#L86 | newOrder.subaccount = currentOrder.subaccount

(storage) CLOBLib._executeAmendNewOrder(Book,Order,AmendLimitOrderArgs).ds |
(w) 🔗 BookLib.addOrderToBook | 🎯#L377 | self.orders[order.id] = order
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L395 | self.metadata.numBids ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L396 | self.metadata.quoteOI += order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L400 | self.metadata.numAsks ++
(w) 🔗 BookLib._updateBookPostOrder | 🎯#L401 | self.metadata.baseOI += order.amount
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L409 | limit.headOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L410 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L413 | tailOrder.nextOrderId = order.id
(w) 🔗 BookLib._updateLimitPostOrder | 🎯#L415 | limit.tailOrder = order.id
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L421 | self.metadata.numBids --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L423 | self.metadata.quoteOI -= order.amount.fullMulDiv(order.price,1e18)
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L425 | self.metadata.numAsks --
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L427 | self.metadata.baseOI -= order.amount
(w) 🔗 BookLib._updateBookRemoveOrder | 🎯#L430 | delete self.orders[order.id]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L438 | delete self.bidLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L441 | delete self.askLimits[order.price]
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L449 | self.orders[order.prevOrderId].nextOrderId = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L450 | limit.headOrder = order.nextOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L452 | self.orders[order.nextOrderId].prevOrderId = order.prevOrderId
(w) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L453 | limit.tailOrder = order.prevOrderId
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L445 | ds.metadata.baseOI -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L446 | ds.metadata.quoteOI -= tradeData.quoteTraded
(i) (w) 🔗 CLOBLib._matchIncomingOrder | 🎯#L456 | matchedOrder.amount -= tradeData.baseTraded
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L503 | order.amount = positionAmount
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | ds.metadata.quoteOI -= reduceAmount.fullMulDiv(order.price,1e18)
(i) (w) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L506 | ds.metadata.baseOI -= reduceAmount
(w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(r*) 🔗 BookLib.addOrderToBook | 🎯#L369 | StorageLib.loadMarket(self.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(r*) 🔗 BookLib.addOrderToBook | 🎯#L374 | limit = _updateBookPostOrder(self,order)
(r*) 🔗 BookLib.removeOrderFromBook | 🎯#L382 | StorageLib.loadMarket(self.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,order.id.unwrap(),self.config.bookType)
(i) (r*) 🔗 CLOBLib._executeBuyOrder | 🎯#L233 | (quoteSent,baseReceived) = _matchIncomingBid(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._executeSellOrder | 🎯#L278 | (quoteReceived,baseSent) = _matchIncomingAsk(ds,newOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L325 | _updateOrderbookNotional(asset,owner,subaccount,- quoteTokenAmount.toInt256())
(i) (r*) 🔗 CLOBLib._matchIncomingBid | 🎯#L358 | data = _matchIncomingOrder(ds,bestAskOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingAsk | 🎯#L389 | data = _matchIncomingOrder(ds,bestBidOrder,incomingOrder,baseDenominated)
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L427 | unfillable = StorageLib.loadClearingHouse().processMakerFill(MakerFillResult({asset:ds.config.asset,bookType:ds.config.bookType,orderId:matchedOrder.id.unwrap(),maker:matchedOwner,subaccount:matchedOrder.subaccount,side:matchedOrder.side,quoteAmountTraded:tradeData.quoteTraded,baseAmountTraded:tradeData.baseTraded,reduceOnly:matchedOrder.reduceOnly}))
(i) (r*) 🔗 CLOBLib._matchIncomingOrder | 🎯#L450 | _updateOrderbookNotional(ds.config.asset,matchedOwner,matchedOrder.subaccount,- tradeData.quoteTraded.toInt256())
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L549 | ds.removeOrderFromBook(order)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L552 | _executeBuyOrder(ds,newOrder,TiF.MOC,true)
(i) (r*) 🔗 CLOBLib._executeAmendNewOrder | 🎯#L553 | _executeSellOrder(ds,newOrder,TiF.MOC,true)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.insert | 🎯#L66 | RedBlackTreeLib.insert(tree.tree,nodeKey)
(r) 🔗 BookRedBlackTreeLib.remove | 🎯#L70 | RedBlackTreeLib.remove(tree.tree,nodeKey)
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L158 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L162 | takerBase -= tradeData.baseTraded = makerBase.min(takerBase) / lotSize * lotSize
(r) 🔗 BookLib.getTradedAmounts | 🎯🟩#L165 | takerBase < lotSize
(r) 🔗 BookLib.boundToLots | 🎯🟩#L176 | lotSize = self.config.lotSize
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L186 | postableBaseAmount = self.boundToLots(baseAmount)
(r) 🔗 BookLib.getPostableBaseAmount | 🎯🟩#L188 | postableBaseAmount < StorageLib.loadBookSettings(self.config.asset).minLimitOrderAmountInBase
(r) 🔗 BookLib.incrementLimitsPlaced | 🎯🟢#L353 | limitsPlaced == StorageLib.loadBookSettings(self.config.asset).maxLimitsPerTx
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L393 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | self.bidTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L394 | limit.numOrders == 0
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L398 | limit = self.askLimits[order.price]
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | self.askTree.insert(order.price)
(r) 🔗 BookLib._updateBookPostOrder | 🎯#L399 | limit.numOrders == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L408 | limit.headOrder.unwrap() == 0
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L412 | tailOrder = self.orders[limit.tailOrder]
(r) 🔗 BookLib._updateLimitPostOrder | 🎯#L414 | order.prevOrderId = tailOrder.id
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L434 | limit = self.bidLimits[order.price]
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L439 | self.bidTree.remove(order.price)
(r) 🔗 BookLib._updateLimitRemoveOrder | 🎯#L442 | self.askTree.remove(order.price)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L231 | ds.getBestAsk() <= newOrder.price
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L249 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L253 | ds.metadata.numBids < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L257 | ds.metadata.numBids == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price > ds.getMinBidPrice()
(i) (r) 🔗 CLOBLib._executeBuyOrder | 🎯#L261 | removeOrder = ds.orders[ds.bidLimits[ds.getMinBidPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L276 | ds.getBestBid() >= newOrder.price
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L294 | newOrder.amount = ds.getPostableBaseAmount(newOrder.amount)
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L298 | ds.metadata.numAsks < StorageLib.loadBookSettings(ds.config.asset).maxNumOrders
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L301 | ds.metadata.numAsks == StorageLib.loadBookSettings(ds.config.asset).maxNumOrders && newOrder.price < ds.getMaxAskPrice()
(i) (r) 🔗 CLOBLib._executeSellOrder | 🎯#L304 | removeOrder = ds.orders[ds.askLimits[ds.getMaxAskPrice()].tailOrder]
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L315 | quoteTokenAmount = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L316 | orderId = order.id.unwrap()
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L317 | asset = ds.config.asset
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L318 | owner = order.owner
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L319 | subaccount = order.subaccount
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L322 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._removeUnfillableOrder | 🎯#L323 | collateralRefund = quoteTokenAmount.fullMulDiv(1e18,_getLeverage(asset,owner,subaccount))
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L342 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L343 | maxAsk = StorageLib.loadMarket(ds.config.asset).getMaxDivergingAskPrice()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L345 | bestAsk <= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L346 | bestAsk == type()(uint256).max
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L347 | bestAsk > maxAsk
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L349 | limit = ds.askLimits[bestAsk]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L350 | bestAskOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L352 | bestAskOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L354 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L360 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L362 | baseReceived += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L363 | quoteSent += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | bestAsk = ds.getBestAsk()
(i) (r) 🔗 CLOBLib._matchIncomingBid | 🎯#L365 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L373 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L374 | minBid = StorageLib.loadMarket(ds.config.asset).getMaxDivergingBidPrice()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L376 | bestBid >= incomingOrder.price && incomingOrder.amount > 0
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L378 | bestBid < minBid
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L380 | limit = ds.bidLimits[bestBid]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L381 | bestBidOrder = ds.orders[limit.headOrder]
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L383 | bestBidOrder.isExpired()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L385 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L391 | incomingOrder.amount -= data.filledAmount
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L393 | totalQuoteTokenReceived += data.quoteTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L394 | totalBaseTokenSent += data.baseTraded
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | bestBid = ds.getBestBid()
(i) (r) 🔗 CLOBLib._matchIncomingAsk | 🎯#L396 | limit.numOrders == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L406 | matchedOwner = matchedOrder.owner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L408 | incomingOrder.owner == matchedOwner
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L413 | matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L415 | tradeData = ds.getTradedAmounts({makerBase:matchedOrder.amount,takerAmount:incomingOrder.amount,price:matchedOrder.price,baseDenominated:baseDenominated})
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L422 | tradeData.baseTraded == 0
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L424 | orderRemoved = tradeData.baseTraded == matchedOrder.amount
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L444 | ! orderRemoved
(i) (r) 🔗 CLOBLib._matchIncomingOrder | 🎯#L449 | ! matchedOrder.reduceOnly
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L498 | positionAmount = StorageLib.loadMarket(ds.config.asset).position[order.owner][order.subaccount].amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L500 | positionAmount < order.amount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L501 | reduceAmount = order.amount - positionAmount
(i) (r) 🔗 CLOBLib._boundReduceOnlyOrder | 🎯#L505 | order.side == Side.BUY
(r) 🔗 MarketLib.getMaxDivergingBidPrice | 🎯🟩#L409 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib.getMaxDivergingAskPrice | 🎯🟩#L416 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?matchedOrder.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._executeAmendAmount(Book,Order,AmendLimitOrderArgs).order |
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L607 | order.amount = args.baseAmount
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L608 | order.reduceOnly = args.reduceOnly
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L609 | order.expiryTime = args.expiryTime
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L597 | StorageLib.loadMarket(ds.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L601 | StorageLib.loadMarket(ds.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L568 | price = order.price
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L569 | newQuoteAmount = args.baseAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L570 | oldQuoteAmount = order.amount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L571 | leverage = _getLeverage(args.asset,order.owner,args.subaccount)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L573 | ! order.reduceOnly
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L574 | orderNotional = order.amount.fullMulDiv(order.price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L575 | notionalDelta -= orderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L576 | collateralDelta -= orderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L580 | newOrderNotional = args.baseAmount.fullMulDiv(price,1e18)
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L581 | notionalDelta += newOrderNotional.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L582 | collateralDelta += newOrderNotional.fullMulDiv(1e18,leverage).toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L585 | order.side == Side.BUY
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L586 | quoteDelta = oldQuoteAmount.toInt256() - newQuoteAmount.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L590 | baseDelta = order.amount.toInt256() - args.baseAmount.toInt256()
(i) (r) 🔗 CLOBLib._executeAmendAmount | 🎯#L595 | order.reduceOnly != args.reduceOnly
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._executeAmendAmount | 🎯#L700 | order.amount = amount
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._boundMakerToLotSize | 🎯#L794 | order.amount -= remainder
    (🔀?order.amount?)  (w) 🔗 CLOB._matchIncomingOrder | 🎯#L840 | makerOrder.amount -= matchData.baseDelta

(storage) CLOBLib._executeAmendAmount(Book,Order,AmendLimitOrderArgs).ds |
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L588 | ds.metadata.quoteOI = (ds.metadata.quoteOI.toInt256() - quoteDelta).abs()
(i) (w) 🔗 CLOBLib._executeAmendAmount | 🎯#L592 | ds.metadata.baseOI = (ds.metadata.baseOI.toInt256() - baseDelta).abs()
(w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L597 | StorageLib.loadMarket(ds.config.asset).linkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(i) (r*) 🔗 CLOBLib._executeAmendAmount | 🎯#L601 | StorageLib.loadMarket(ds.config.asset).unlinkReduceOnlyOrder(order.owner,order.subaccount,args.orderId,ds.config.bookType)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTL.onlyPerpManager#52:13 | 🎯🌈🟢 | msg.sender != perpManager
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#92:9 | 🎯🟩 | self.expiryTime != NULL_TIMESTAMP && self.expiryTime < block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#97:9 | 🎯🟩 | expiryTime != NULL_TIMESTAMP && expiryTime < block.timestamp

modifiers_html

functions_html

ClearingHouseLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/ClearingHouse.sol#49:1

state_vars_html

(storage) ClearingHouseLib.placeOrder(ClearingHouse,address,PlaceOrderArgs,BookType).self |
(i) (w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L114 | orderResult = market.placeOrder(account,args,bookType)
(i) (r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L124 | StorageLib.loadCollateralManager().handleCollateralDelta({account:account,collateralDelta:collateralPosted.toInt256()})
(i) (r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L132 | _processTakerFill(self,__FillParams__({asset:args.asset,account:account,subaccount:args.subaccount,side:args.side,quoteAmount:orderResult.quoteTraded,baseAmount:orderResult.baseTraded,collateralPosted:collateralPosted}))
(i) (r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(i) (r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 ClearingHouseLib.placeOrder | 🎯#L112 | market = self.market[args.asset]
(i) (r) 🔗 ClearingHouseLib.placeOrder | 🎯#L117 | orderResult.basePosted > 0 && ! args.reduceOnly
(i) (r) 🔗 ClearingHouseLib.placeOrder | 🎯#L118 | collateralPosted = _getCollateral(orderResult.basePosted,args.limitPrice,market.getPositionLeverage(account,args.subaccount))
(i) (r) 🔗 ClearingHouseLib.placeOrder | 🎯#L123 | orderResult.baseTraded == 0
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L312 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L314 | equity = margin + upnl
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L318 | finalMarginDelta = marginDelta.min((intendedMargin.toInt256() - equity).max(0))
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L320 | finalMargin = margin + finalMarginDelta
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L335 | intendedMargin == 0
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L340 | equity = margin + upnl
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(i) (r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(i) (r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L585 | cache.assets = self.assets[params.account][params.subaccount].values().wrap()
(i) (r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L599 | cache.positions = _getPositions(self,cache.assets,params.account,params.subaccount,isNewPosition)
(i) (r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L622 | (cache.margin,cache.positionResult.marginDelta) = self.rebalanceAccount({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(i) (r) 🔗 ClearingHouseLib.assertNotLiquidatable | 🎯🟩#L748 | self.isLiquidatable(assets,positions,margin,BookType.STANDARD)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ClearingHouseLib.placeOrder(ClearingHouse,address,PlaceOrderArgs,BookType).market | self.market[args.asset]
(i) (w) 🔗 ClearingHouseLib.placeOrder | 🎯#L112 | market = self.market[args.asset]
(i) (r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L114 | orderResult = market.placeOrder(account,args,bookType)
(i) (r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L124 | StorageLib.loadCollateralManager().handleCollateralDelta({account:account,collateralDelta:collateralPosted.toInt256()})
(i) (r*) 🔗 ClearingHouseLib.placeOrder | 🎯#L132 | _processTakerFill(self,__FillParams__({asset:args.asset,account:account,subaccount:args.subaccount,side:args.side,quoteAmount:orderResult.quoteTraded,baseAmount:orderResult.baseTraded,collateralPosted:collateralPosted}))
(i) (r) 🔗 ClearingHouseLib.placeOrder | 🎯#L117 | orderResult.basePosted > 0 && ! args.reduceOnly
(i) (r) 🔗 ClearingHouseLib.placeOrder | 🎯#L118 | collateralPosted = _getCollateral(orderResult.basePosted,args.limitPrice,market.getPositionLeverage(account,args.subaccount))
(i) (r) 🔗 ClearingHouseLib.placeOrder | 🎯#L123 | orderResult.baseTraded == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong

(storage) ClearingHouseLib.processMakerFill(ClearingHouse,MakerFillResult).self |
(i) (w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(i) (r*) 🔗 ClearingHouseLib.processMakerFill | 🎯#L230 | self.market[makerResult.asset].unlinkReduceOnlyOrder(makerResult.maker,makerResult.subaccount,makerResult.orderId,makerResult.bookType)
(i) (r*) 🔗 ClearingHouseLib.processMakerFill | 🎯#L235 | self.updateAccount({account:makerResult.maker,subaccount:makerResult.subaccount,assets:cache.assets,positions:cache.positions,tradedAsset:makerResult.asset,positionIdx:positionIdx,oiDelta:cache.positionResult.oiDelta,sideClose:cache.positionResult.sideClose})
(i) (r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(i) (r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 ClearingHouseLib.processMakerFill | 🎯#L160 | cache.assets = self.getAssets(makerResult.maker,makerResult.subaccount)
(i) (r) 🔗 ClearingHouseLib.processMakerFill | 🎯#L174 | cache.positions = _getPositions(self,cache.assets,makerResult.maker,makerResult.subaccount,cache.isNewPosition)
(i) (r) 🔗 ClearingHouseLib.processMakerFill | 🎯#L200 | (cache.margin,cache.positionResult.marginDelta) = self.rebalanceAccount({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(i) (r) 🔗 ClearingHouseLib.processMakerFill | 🎯#L212 | self.isLiquidatable(cache.assets,cache.positions,cache.margin,BookType.STANDARD)
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L312 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L314 | equity = margin + upnl
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L318 | finalMarginDelta = marginDelta.min((intendedMargin.toInt256() - equity).max(0))
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L320 | finalMargin = margin + finalMarginDelta
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L335 | intendedMargin == 0
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L340 | equity = margin + upnl
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(i) (r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ClearingHouseLib.setAssets(ClearingHouse,address,uint256,uint256,bytes32).self |
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ClearingHouseLib.setPositions(ClearingHouse,bytes32,address,uint256,DynamicArrayLib.DynamicArray,Position[]).self |
(i) (w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(i) (r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])

(storage) ClearingHouseLib.rebalanceAccount(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],int256,int256).self |
(i) (r) 🔗 ClearingHouseLib.rebalanceAccount | 🎯🟩#L299 | self.rebalanceOpen({assets:assets,positions:positions,margin:margin,marginDelta:marginDelta})
(i) (r) 🔗 ClearingHouseLib.rebalanceAccount | 🎯🟩#L301 | self.rebalanceClose({assets:assets,positions:positions,margin:margin,marginDelta:marginDelta})
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L312 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L314 | equity = margin + upnl
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L318 | finalMarginDelta = marginDelta.min((intendedMargin.toInt256() - equity).max(0))
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L320 | finalMargin = margin + finalMarginDelta
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L335 | intendedMargin == 0
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L340 | equity = margin + upnl
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)

(storage) ClearingHouseLib.rebalanceOpen(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],int256,int256).self |
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L312 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L314 | equity = margin + upnl
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L318 | finalMarginDelta = marginDelta.min((intendedMargin.toInt256() - equity).max(0))
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L320 | finalMargin = margin + finalMarginDelta
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)

(storage) ClearingHouseLib.rebalanceClose(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],int256,int256).self |
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L335 | intendedMargin == 0
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L340 | equity = margin + upnl
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)

(storage) ClearingHouseLib.updateAccount(ClearingHouse,address,uint256,DynamicArrayLib.DynamicArray,Position[],bytes32,uint256,OIDelta,bool).self |
(i) (w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(i) (r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L361 | self.setPositions(tradedAsset,account,subaccount,assets,positions)
(i) (r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L365 | self.setAssets(account,subaccount,assets.length(),tradedAsset)
(i) (r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ClearingHouseLib.getAssets(ClearingHouse,address,uint256).self |
(i) (r) 🔗 ClearingHouseLib.getAssets | 🎯🟩#L381 | self.assets[account][subaccount].values().wrap()
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ClearingHouseLib.getAccount(ClearingHouse,address,uint256).self |
(i) (r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(i) (r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ClearingHouseLib.getAccountAndMargin(ClearingHouse,address,uint256).self |
(i) (r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(i) (r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(i) (r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ClearingHouseLib.getUpnl(ClearingHouse,DynamicArrayLib.DynamicArray,Position[]).self |
(i) (r) 🔗 ClearingHouseLib.getUpnl | 🎯🟩#L410 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)

(storage) ClearingHouseLib.getIntendedMargin(ClearingHouse,DynamicArrayLib.DynamicArray,Position[]).self |
(i) (r) 🔗 ClearingHouseLib.getIntendedMargin | 🎯🟩#L422 | intendedMargin += self.market[assets.getBytes32(i)].getIntendedMargin(positions[i])
(r) 🔗 MarketLib.getIntendedMargin | 🎯🟩#L338 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMargin | 🎯🟩#L340 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)

(storage) ClearingHouseLib.getProratedMargin(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],bytes32,int256).self |
(i) (r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L440 | notional = self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(i) (r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L441 | totalNotional += notional
(i) (r) 🔗 ClearingHouseLib.getProratedMargin | 🎯🟩#L443 | assetNotional = notional

(storage) ClearingHouseLib.getNotionalAccountValue(ClearingHouse,DynamicArrayLib.DynamicArray,Position[]).self |
(i) (r) 🔗 ClearingHouseLib.getNotionalAccountValue | 🎯🟩#L469 | totalNotional += self.market[assets.getBytes32(i)].getNotionalValue(positions[i])

(storage) ClearingHouseLib.getFundingPayment(ClearingHouse,address,uint256).self |
(i) (r) 🔗 ClearingHouseLib.getFundingPayment | 🎯🟩#L478 | assets = self.assets[account][subaccount].values()
(i) (r) 🔗 ClearingHouseLib.getFundingPayment | 🎯🟩#L481 | fundingPayment += self.market[assets[i]].getFundingPayment(account,subaccount)
(r) 🔗 MarketLib.getFundingPayment | 🎯🟩#L403 | position = self.position[account][subaccount]
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ClearingHouseLib.isLiquidatable(ClearingHouse,address,uint256,BookType).self |
(i) (r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L389 | assets = self.assets[account][subaccount].values().wrap()
(i) (r) 🔗 ClearingHouseLib.getAccount | 🎯🟩#L390 | positions = _getPositions(self,assets,account,subaccount,false)
(i) (r) 🔗 ClearingHouseLib.getAccountAndMargin | 🎯🟩#L398 | (assets,positions) = self.getAccount(account,subaccount)
(i) (r) 🔗 ClearingHouseLib.getFundingPayment | 🎯🟩#L478 | assets = self.assets[account][subaccount].values()
(i) (r) 🔗 ClearingHouseLib.getFundingPayment | 🎯🟩#L481 | fundingPayment += self.market[assets[i]].getFundingPayment(account,subaccount)
(i) (r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L490 | (assets,positions,margin) = self.getAccountAndMargin(account,subaccount)
(i) (r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L493 | fundingPayment = self.getFundingPayment(account,subaccount)
(i) (r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L495 | self.isLiquidatable(assets,positions,margin - fundingPayment,bookType)
(i) (r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib.getFundingPayment | 🎯🟩#L403 | position = self.position[account][subaccount]
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ClearingHouseLib.isLiquidatable(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],int256,BookType).self |
(i) (r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)

(storage) ClearingHouseLib.isOpenMarginRequirementMet(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],int256).self |
(i) (r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L529 | minOpenMargin += self.market[assets.getBytes32(i)].getMinOpenMargin(positions[i].amount)
(i) (r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L530 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L348 | positionNotional = positionAmount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L350 | minOpenMargin = positionNotional.fullMulDiv(1e18,StorageLib.loadMarketSettings(self.asset).maxOpenLeverage)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)

(storage) ClearingHouseLib.hasBadDebt(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],int256).self |
(i) (r) 🔗 ClearingHouseLib.hasBadDebt | 🎯🟩#L544 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)

(storage) ClearingHouseLib._processTakerFill(ClearingHouse,ClearingHouseLib.__FillParams__).self |
(i) (w) 🔗 ClearingHouseLib.setPositions | 🎯#L285 | self.market[assets.getBytes32(i)].position[account][subaccount].lastCumulativeFunding = positions[i].lastCumulativeFunding
(w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position
(w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 ClearingHouseLib.setPositions | 🎯#L283 | self.market[assets.getBytes32(i)].setPosition(account,subaccount,positions[i])
(i) (r*) 🔗 ClearingHouseLib.updateAccount | 🎯#L369 | self.market[tradedAsset].cancelCloseOrders(account,subaccount)
(i) (r*) 🔗 ClearingHouseLib._processTakerFill | 🎯#L641 | self.updateAccount({account:params.account,subaccount:params.subaccount,assets:cache.assets,positions:cache.positions,tradedAsset:params.asset,positionIdx:positionIdx,oiDelta:cache.positionResult.oiDelta,sideClose:cache.positionResult.sideClose})
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L258 | oldLength = self.assets[account][subaccount].length()
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L260 | oldLength == newLength
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | self.assets[account][subaccount].add(asset)
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L262 | oldLength < newLength
(i) (r) 🔗 ClearingHouseLib.setAssets | 🎯🌀#L263 | self.assets[account][subaccount].remove(asset)
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L312 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L314 | equity = margin + upnl
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L318 | finalMarginDelta = marginDelta.min((intendedMargin.toInt256() - equity).max(0))
(i) (r) 🔗 ClearingHouseLib.rebalanceOpen | 🎯🟩#L320 | finalMargin = margin + finalMarginDelta
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L332 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L335 | intendedMargin == 0
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L340 | equity = margin + upnl
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L345 | finalMarginDelta = marginDelta.max((intendedMargin.toInt256() - equity).min(0))
(i) (r) 🔗 ClearingHouseLib.rebalanceClose | 🎯🟩#L347 | finalMargin = margin + finalMarginDelta
(i) (r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(i) (r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L585 | cache.assets = self.assets[params.account][params.subaccount].values().wrap()
(i) (r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L599 | cache.positions = _getPositions(self,cache.assets,params.account,params.subaccount,isNewPosition)
(i) (r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L622 | (cache.margin,cache.positionResult.marginDelta) = self.rebalanceAccount({assets:cache.assets,positions:cache.positions,margin:cache.margin,marginDelta:cache.positionResult.marginDelta})
(i) (r) 🔗 ClearingHouseLib._processTakerFill | 🎯#L630 | self.assertNotLiquidatable(cache.assets,cache.positions,cache.margin)
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(i) (r) 🔗 ClearingHouseLib.assertNotLiquidatable | 🎯🟩#L748 | self.isLiquidatable(assets,positions,margin,BookType.STANDARD)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]
(r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) ClearingHouseLib._getIntendedMarginAndUpnl(ClearingHouse,DynamicArrayLib.DynamicArray,Position[]).self |
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)

(storage) ClearingHouseLib._getPositions(ClearingHouse,DynamicArrayLib.DynamicArray,address,uint256,bool).self |
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L684 | positions[i] = self.market[assets.getBytes32(i)].getPosition(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L688 | positions[length - 1].leverage = self.market[assets.getBytes32(length - 1)].getPositionLeverage(account,subaccount)
(i) (r) 🔗 ClearingHouseLib._getPositions | 🎯🟩#L691 | positions[length - 1] = self.market[assets.getBytes32(length - 1)].getPosition(account,subaccount)
(r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0
(r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage

(storage) ClearingHouseLib.assertNotLiquidatable(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],int256).self |
(i) (r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(i) (r) 🔗 ClearingHouseLib.assertNotLiquidatable | 🎯🟩#L748 | self.isLiquidatable(assets,positions,margin,BookType.STANDARD)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)

(storage) ClearingHouseLib.assertLiquidatable(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],int256,BookType).self |
(i) (r) 🔗 ClearingHouseLib.isLiquidatable | 🎯🟩#L507 | (cache.upnl,cache.minMargin) = self.market[assets.getBytes32(i)].getUpnlAndMinMargin(positions[i],bookType)
(i) (r) 🔗 ClearingHouseLib.assertLiquidatable | 🎯🟩#L758 | ! self.isLiquidatable(assets,positions,margin,bookType)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)

(storage) ClearingHouseLib.assertPostWithdrawalMarginRequired(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],int256).self |
(i) (r) 🔗 ClearingHouseLib.getNotionalAccountValue | 🎯🟩#L469 | totalNotional += self.market[assets.getBytes32(i)].getNotionalValue(positions[i])
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L663 | (intendedMargin,upnl) = self.market[assets.getBytes32(i)].getIntendedMarginAndUpnl(positions[i])
(i) (r) 🔗 ClearingHouseLib._getIntendedMarginAndUpnl | 🎯🟩#L665 | totalIntendedMargin += intendedMargin
(i) (r) 🔗 ClearingHouseLib.assertPostWithdrawalMarginRequired | 🎯🟩#L769 | (intendedMargin,upnl) = _getIntendedMarginAndUpnl(self,assets,positions)
(i) (r) 🔗 ClearingHouseLib.assertPostWithdrawalMarginRequired | 🎯🟩#L770 | totalNotional = self.getNotionalAccountValue(assets,positions)
(i) (r) 🔗 ClearingHouseLib.assertPostWithdrawalMarginRequired | 🎯🟩#L772 | intendedMargin = intendedMargin.max(totalNotional / 10)
(i) (r) 🔗 ClearingHouseLib.assertPostWithdrawalMarginRequired | 🎯🟩#L774 | margin + upnl < intendedMargin.toInt256()
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)

(storage) ClearingHouseLib.assertOpenMarginRequired(ClearingHouse,DynamicArrayLib.DynamicArray,Position[],int256).self |
(i) (r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L529 | minOpenMargin += self.market[assets.getBytes32(i)].getMinOpenMargin(positions[i].amount)
(i) (r) 🔗 ClearingHouseLib.isOpenMarginRequirementMet | 🎯🟩#L530 | upnl += self.market[assets.getBytes32(i)].getUpnl(positions[i])
(i) (r) 🔗 ClearingHouseLib.assertOpenMarginRequired | 🎯🟩#L784 | ! self.isOpenMarginRequirementMet(assets,positions,margin)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L348 | positionNotional = positionAmount.fullMulDiv(self.markPrice,1e18)
(r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L350 | minOpenMargin = positionNotional.fullMulDiv(1e18,StorageLib.loadMarketSettings(self.asset).maxOpenLeverage)
(r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)

Solidity Vars Used

msg.sender
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 GTL.onlyPerpManager#52:13 | 🎯🌈🟢 | msg.sender != perpManager
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])

block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#92:9 | 🎯🟩 | self.expiryTime != NULL_TIMESTAMP && self.expiryTime < block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#97:9 | 🎯🟩 | expiryTime != NULL_TIMESTAMP && expiryTime < block.timestamp

External Calls

ClearingHouseLib.setAssets | 🎯🌀 | IGTL(Constants.GTL).addSubaccount(subaccount)
ClearingHouseLib.setAssets | 🎯🌀 | IGTL(Constants.GTL).removeSubaccount(subaccount)


modifiers_html

functions_html

CollateralManagerLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/CollateralManager.sol#18:1

state_vars_html

(storage) CollateralManagerLib.depositFreeCollateral(CollateralManager,address,address,uint256).self |
(i) (w) 🔗 CollateralManagerLib.creditAccount | 🎯#L112 | self.freeCollateral[account] += amount
(i) (r*) 🔗 CollateralManagerLib.depositFreeCollateral | 🎯🟢#L37 | self.creditAccount(to,amount)

(storage) CollateralManagerLib.withdrawFreeCollateral(CollateralManager,address,uint256).self |
(i) (w) 🔗 CollateralManagerLib.debitAccount | 🎯#L117 | self.freeCollateral[account] -= amount
(i) (r*) 🔗 CollateralManagerLib.withdrawFreeCollateral | 🎯🟢#L42 | self.debitAccount(account,amount)
(i) (r) 🔗 CollateralManagerLib.debitAccount | 🎯#L116 | self.freeCollateral[account] < amount

(storage) CollateralManagerLib.depositFromSpot(CollateralManager,address,uint256).self |
(i) (w) 🔗 CollateralManagerLib.creditAccount | 🎯#L112 | self.freeCollateral[account] += amount
(i) (r*) 🔗 CollateralManagerLib.depositFromSpot | 🎯#L48 | self.creditAccount(account,amount)

(storage) CollateralManagerLib.withdrawToSpot(CollateralManager,address,uint256,address).self |
(i) (w) 🔗 CollateralManagerLib.debitAccount | 🎯#L117 | self.freeCollateral[account] -= amount
(i) (r*) 🔗 CollateralManagerLib.withdrawToSpot | 🎯🟢#L55 | self.debitAccount(account,amount)
(i) (r) 🔗 CollateralManagerLib.debitAccount | 🎯#L116 | self.freeCollateral[account] < amount

(storage) CollateralManagerLib.settleMarginUpdate(CollateralManager,address,uint256,int256,int256).self |
(i) (w) 🔗 CollateralManagerLib.creditAccount | 🎯#L112 | self.freeCollateral[account] += amount
(i) (w) 🔗 CollateralManagerLib.debitAccount | 🎯#L117 | self.freeCollateral[account] -= amount
(i) (w) 🔗 CollateralManagerLib.settleMarginUpdate | 🎯#L67 | remainingMargin = self.margin[account][subaccount] += marginDelta - fundingPayment
(i) (r*) 🔗 CollateralManagerLib.settleMarginUpdate | 🎯#L69 | self.handleCollateralDelta(account,marginDelta)
(i) (r) 🔗 CollateralManagerLib.debitAccount | 🎯#L116 | self.freeCollateral[account] < amount

(storage) CollateralManagerLib.settleNewLeverage(CollateralManager,address,uint256,int256,int256,int256).self |
(i) (w) 🔗 CollateralManagerLib.creditAccount | 🎯#L112 | self.freeCollateral[account] += amount
(i) (w) 🔗 CollateralManagerLib.debitAccount | 🎯#L117 | self.freeCollateral[account] -= amount
(i) (w) 🔗 CollateralManagerLib.settleNewLeverage | 🎯#L88 | self.margin[account][subaccount] = newMargin
(i) (r*) 🔗 CollateralManagerLib.settleNewLeverage | 🎯#L86 | self.handleCollateralDelta(account,collateralDelta)
(i) (r) 🔗 CollateralManagerLib.debitAccount | 🎯#L116 | self.freeCollateral[account] < amount
(i) (r) 🔗 CollateralManagerLib.settleNewLeverage | 🎯#L80 | currentMargin = self.margin[account][subaccount] - fundingPayment
(i) (r) 🔗 CollateralManagerLib.settleNewLeverage | 🎯#L82 | collateralDeltaFromPosition = newMargin - currentMargin
(i) (r) 🔗 CollateralManagerLib.settleNewLeverage | 🎯#L84 | collateralDelta = collateralDeltaFromPosition + collateralDeltaFromBook

(storage) CollateralManagerLib.settleFill(CollateralManager,address,uint256,int256,int256).self |
(i) (w) 🔗 CollateralManagerLib.settleFill | 🎯#L102 | self.margin[account][subaccount] = margin
(i) (w) 🔗 CollateralManagerLib.creditAccount | 🎯#L112 | self.freeCollateral[account] += amount
(i) (w) 🔗 CollateralManagerLib.debitAccount | 🎯#L117 | self.freeCollateral[account] -= amount
(i) (r*) 🔗 CollateralManagerLib.settleFill | 🎯#L104 | self.handleCollateralDelta(account,marginDelta)
(i) (r) 🔗 CollateralManagerLib.debitAccount | 🎯#L116 | self.freeCollateral[account] < amount

(storage) CollateralManagerLib.creditAccount(CollateralManager,address,uint256).self |
(i) (w) 🔗 CollateralManagerLib.creditAccount | 🎯#L112 | self.freeCollateral[account] += amount

(storage) CollateralManagerLib.debitAccount(CollateralManager,address,uint256).self |
(i) (w) 🔗 CollateralManagerLib.debitAccount | 🎯#L117 | self.freeCollateral[account] -= amount
(i) (r) 🔗 CollateralManagerLib.debitAccount | 🎯#L116 | self.freeCollateral[account] < amount

(storage) CollateralManagerLib.handleCollateralDelta(CollateralManager,address,int256).self |
(i) (w) 🔗 CollateralManagerLib.creditAccount | 🎯#L112 | self.freeCollateral[account] += amount
(i) (w) 🔗 CollateralManagerLib.debitAccount | 🎯#L117 | self.freeCollateral[account] -= amount
(i) (r*) 🔗 CollateralManagerLib.handleCollateralDelta | 🎯#L121 | self.debitAccount(account,collateralDelta.abs())
(i) (r*) 🔗 CollateralManagerLib.handleCollateralDelta | 🎯#L122 | self.creditAccount(account,collateralDelta.abs())
(i) (r) 🔗 CollateralManagerLib.debitAccount | 🎯#L116 | self.freeCollateral[account] < amount

(storage) CollateralManagerLib.getFreeCollateralBalance(CollateralManager,address).self |
(storage) CollateralManagerLib.getMarginBalance(CollateralManager,address,uint256).self |
(i) (r) 🔗 CollateralManagerLib.getMarginBalance | 🎯🟩#L142 | self.margin[account][subaccount]

Solidity Vars Used

msg.sender
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 PerpManager.depositTo#112:9 | 🎯💥 | StorageLib.loadCollateralManager().depositFreeCollateral({from:msg.sender,to:account,amount:amount})
msg.sender @ 🔗 PerpManager.withdrawToSpot#128:13 | 🎯💥🟢 | msg.sender != address(accountManager)
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])
this @ 🔗 GTL.freeCollateralBalance#224:9 | 🎯💥🟢🟩🌀 | IViewPort(perpManager).getFreeCollateralBalance(address(this))
this @ 🔗 CollateralManagerLib.depositFreeCollateral#36:9 | 🎯🟢 | USDC.safeTransferFrom(from,address(this),amount)

modifiers_html

functions_html

Constants,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/Constants.sol#4:1

state_vars_html

modifiers_html

functions_html

FeeManagerLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/FeeManager.sol#18:1

state_vars_html

(storage) FeeManagerLib.setAccountFeeTier(FeeManager,address,FeeTier).self |
(i) (w) 🔗 FeeManagerLib.setAccountFeeTier | 🎯#L24 | self.accountFeeTier[account] = feeTier
    (🔀?self.accountFeeTier[account]?)  (w) 🔗 FeeDataLib.setAccountFeeTier | 🎯#L121 | self.accountFeeTier[account] = feeTier
    (🔀?self.accountFeeTier[account]?)  (w) 🔗 FeeDataLib.setAccountFeeTier | 🎯#L121 | self.accountFeeTier[account] = feeTier

(storage) FeeManagerLib.setTakerFeeRates(FeeManager,uint16[]).self |
(i) (w) 🔗 FeeManagerLib.setTakerFeeRates | 🎯#L28 | self.takerFeeRates = PackedFeeRatesLib.packFeeRates(takerFeeRates)

(storage) FeeManagerLib.setMakerFeeRates(FeeManager,uint16[]).self |
(i) (w) 🔗 FeeManagerLib.setMakerFeeRates | 🎯#L32 | self.makerFeeRates = PackedFeeRatesLib.packFeeRates(makerFeeRates)

(storage) FeeManagerLib.getTakerFee(FeeManager,address,uint256).self |
(i) (r) 🔗 FeeManagerLib.getTakerFee | 🎯🟢🟩#L38 | feeRate = self.getTakerFeeRate(account)

(storage) FeeManagerLib.getMakerFee(FeeManager,address,uint256).self |
(i) (r) 🔗 FeeManagerLib.getMakerFee | 🎯🟢🟩#L45 | feeRate = self.getMakerFeeRate(account)

(storage) FeeManagerLib.getTakerFeeRate(FeeManager,address).self |
(i) (r) 🔗 FeeManagerLib.getTakerFeeRate | 🎯🟩#L50 | self.takerFeeRates.getFeeAt(uint256(self.accountFeeTier[account]))

(storage) FeeManagerLib.getMakerFeeRate(FeeManager,address).self |
(i) (r) 🔗 FeeManagerLib.getMakerFeeRate | 🎯🟩#L54 | self.makerFeeRates.getFeeAt(uint256(self.accountFeeTier[account]))

(storage) FeeManagerLib.getAccountFeeTier(FeeManager,address).self |
(i) (r) 🔗 FeeManagerLib.getAccountFeeTier | 🎯🟩#L58 | self.accountFeeTier[account]

(storage) FeeManagerLib.getAccountTakerFeeRate(FeeManager,address).self |
(i) (r) 🔗 FeeManagerLib.getAccountTakerFeeRate | 🎯🟩#L62 | self.takerFeeRates.getFeeAt(uint256(self.accountFeeTier[account]))

(storage) FeeManagerLib.getAccountMakerFeeRate(FeeManager,address).self |
(i) (r) 🔗 FeeManagerLib.getAccountMakerFeeRate | 🎯🟩#L66 | self.makerFeeRates.getFeeAt(uint256(self.accountFeeTier[account]))

Solidity Vars Used

msg.sender
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

modifiers_html

functions_html

FundingLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/FundingRateEngine.sol#28:1

state_vars_html

(storage) FundingLib.init(FundingRateSettings,FundingRateSettings).settings |
(i) (w) 🔗 FundingLib.init | 🎯#L35 | settings.fundingInterval = initSettings.fundingInterval
(i) (w) 🔗 FundingLib.init | 🎯#L36 | settings.resetInterval = initSettings.resetInterval
(i) (w) 🔗 FundingLib.init | 🎯#L37 | settings.resetIterations = initSettings.resetIterations
(i) (w) 🔗 FundingLib.init | 🎯#L38 | settings.innerClamp = initSettings.innerClamp
(i) (w) 🔗 FundingLib.init | 🎯#L39 | settings.outerClamp = initSettings.outerClamp
(i) (w) 🔗 FundingLib.init | 🎯#L40 | settings.interestRate = initSettings.interestRate
    (🔀?settings.fundingInterval?)  (w) 🔗 AdminPanel.setFundingInterval | 🎯💥❌ ['onlyAdmin']#L538 | settings.fundingInterval = fundingInterval
    (🔀?settings.resetInterval?)  (w) 🔗 AdminPanel.setFundingInterval | 🎯💥❌ ['onlyAdmin']#L539 | settings.resetInterval = resetInterval
    (🔀?settings.innerClamp?)  (w) 🔗 AdminPanel.setFundingClamps | 🎯💥❌ ['onlyAdmin']#L564 | settings.innerClamp = innerClamp
    (🔀?settings.outerClamp?)  (w) 🔗 AdminPanel.setFundingClamps | 🎯💥❌ ['onlyAdmin']#L565 | settings.outerClamp = outerClamp

(storage) FundingLib.settleFunding(FundingRateEngine,bytes32,uint256,uint256).settings | StorageLib.loadFundingRateSettings(asset)
(i) (w) 🔗 FundingLib._calcFundingIndex | 🎯#L113 | self.resetIterationsLeft = settings.resetIterations
(i) (w) 🔗 FundingLib.settleFunding | 🎯#L47 | settings = StorageLib.loadFundingRateSettings(asset)
(i) (w) 🔗 FundingLib.settleFunding | 🎯#L62 | self.fundingRate = fundingRate
(i) (r*) 🔗 FundingLib.settleFunding | 🎯#L54 | (fundingIndex,fundingRate) = _calcFundingIndex({self:self,settings:settings,markTwap:markTwap.toInt256(),indexTwap:indexTwap.toInt256()})
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L104 | innerClamp = settings.innerClamp.toInt256()
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L105 | outerClamp = settings.outerClamp.toInt256()
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L109 | rawFunding = premium + (settings.interestRate - premium).clamp(- innerClamp,innerClamp)
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L111 | fundingRate = rawFunding.clamp(- outerClamp,outerClamp)
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L113 | fundingRate != rawFunding
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L116 | fundingIndex = _mul(fundingRate,indexTwap)
(i) (r) 🔗 FundingLib.settleFunding | 🎯#L61 | cumulativeFundingIndex = self.cumulativeFundingIndex += fundingIndex

(storage) FundingLib.settleFunding(FundingRateEngine,bytes32,uint256,uint256).self |
(i) (w) 🔗 FundingLib._calcFundingIndex | 🎯#L113 | self.resetIterationsLeft = settings.resetIterations
(i) (w) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | -- self.resetIterationsLeft
(i) (w) 🔗 FundingLib.settleFunding | 🎯#L51 | self.lastFundingTime = block.timestamp
(i) (w) 🔗 FundingLib.settleFunding | 🎯#L61 | cumulativeFundingIndex = self.cumulativeFundingIndex += fundingIndex
(i) (w) 🔗 FundingLib.settleFunding | 🎯#L62 | self.fundingRate = fundingRate
(i) (r*) 🔗 FundingLib.settleFunding | 🎯#L54 | (fundingIndex,fundingRate) = _calcFundingIndex({self:self,settings:settings,markTwap:markTwap.toInt256(),indexTwap:indexTwap.toInt256()})
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | self.resetIterationsLeft > 0
(i) (r) 🔗 FundingLib.settleFunding | 🎯#L49 | self.assertFundingIntervalElapsed(asset)
(i) (r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(i) (r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L88 | elapsedTime = self.getTimeSinceLastFunding()
(i) (r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L89 | interval = self.getFundingInterval(asset)

(storage) FundingLib.getFundingInterval(FundingRateEngine,bytes32).settings | StorageLib.loadFundingRateSettings(asset)
(i) (w) 🔗 FundingLib.getFundingInterval | 🎯🟩#L70 | settings = StorageLib.loadFundingRateSettings(asset)
(i) (r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | settings.fundingInterval

(storage) FundingLib.getFundingInterval(FundingRateEngine,bytes32).self |
(i) (r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0

(storage) FundingLib.getCumulativeFunding(FundingRateEngine).self |
(i) (r) 🔗 FundingLib.getCumulativeFunding | 🎯🟩#L76 | self.cumulativeFundingIndex

(storage) FundingLib.getTimeSinceLastFunding(FundingRateEngine).self |
(i) (r) 🔗 FundingLib.getTimeSinceLastFunding | 🎯🟩#L80 | block.timestamp - self.lastFundingTime

(storage) FundingLib.assertFundingIntervalElapsed(FundingRateEngine,bytes32).self |
(i) (r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(i) (r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L88 | elapsedTime = self.getTimeSinceLastFunding()
(i) (r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L89 | interval = self.getFundingInterval(asset)

(storage) FundingLib._calcFundingIndex(FundingRateEngine,FundingRateSettings,int256,int256).settings |
(i) (w) 🔗 FundingLib._calcFundingIndex | 🎯#L113 | self.resetIterationsLeft = settings.resetIterations
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L104 | innerClamp = settings.innerClamp.toInt256()
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L105 | outerClamp = settings.outerClamp.toInt256()
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L109 | rawFunding = premium + (settings.interestRate - premium).clamp(- innerClamp,innerClamp)
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L111 | fundingRate = rawFunding.clamp(- outerClamp,outerClamp)
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L113 | fundingRate != rawFunding
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L116 | fundingIndex = _mul(fundingRate,indexTwap)

(storage) FundingLib._calcFundingIndex(FundingRateEngine,FundingRateSettings,int256,int256).self |
(i) (w) 🔗 FundingLib._calcFundingIndex | 🎯#L113 | self.resetIterationsLeft = settings.resetIterations
(i) (w) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | -- self.resetIterationsLeft
(i) (r) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | self.resetIterationsLeft > 0

Solidity Vars Used

msg.sender
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

block.timestamp
block.timestamp @ 🔗 FundingLib.settleFunding#51:9 | 🎯 | self.lastFundingTime = block.timestamp
block.timestamp @ 🔗 MarketLib.init#111:9 | 🎯 | StorageLib.loadFundingRateEngine(asset).lastFundingTime = block.timestamp
block.timestamp @ 🔗 MarketLib.getFundingRateComponent#456:9 | 🎯🟩 | indexPrice.fullMulDiv(1e18 + fundingRateEngine.fundingRate.abs().fullMulDiv(block.timestamp - fundingRateEngine.lastFundingTime,fundingRateEngine.getFundingInterval(asset)),1e18)
block.timestamp @ 🔗 FundingLib.getTimeSinceLastFunding#80:9 | 🎯🟩 | block.timestamp - self.lastFundingTime

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])

modifiers_html

functions_html

InsuranceFundLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/InsuranceFund.sol#14:1

state_vars_html


Solidity Vars Used

self.balance
self.balance @ 🔗 InsuranceFundLib.withdraw#44:13 | 🎯 | self.balance < amount
self.balance @ 🔗 InsuranceFundLib.getBalance#61:9 | 🎯🟩 | self.balance
self.balance @ 🔗 InsuranceFundLib.claim#35:13 | 🎯 | self.balance < amount

msg.sender
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

modifiers_html

functions_html

MarketLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/Market.sol#60:1

state_vars_html

(storage) MarketLib.init(Market,bytes32,MarketSettings,FundingRateSettings,uint256).self |
(i) (w) 🔗 MarketLib.init | 🎯#L106 | self.asset = asset
(i) (w) 🔗 MarketLib.init | 🎯#L107 | self.markPrice = initialPrice
    (🔀?self.asset?)  (w) 🔗 CLOBLib.init | 🎯#L120 | ds.config.asset = asset
    (🔀?self.asset?)  (w) 🔗 CLOBLib.init | 🎯#L126 | ds.config.asset = asset

(storage) MarketLib.init(MarketSettings,MarketSettings).settings |
(i) (w) 🔗 MarketLib.init | 🎯#L115 | settings.status = initSettings.status
(i) (w) 🔗 MarketLib.init | 🎯#L116 | settings.crossMarginEnabled = initSettings.crossMarginEnabled
(i) (w) 🔗 MarketLib.init | 🎯#L117 | settings.maxOpenLeverage = initSettings.maxOpenLeverage
(i) (w) 🔗 MarketLib.init | 🎯#L118 | settings.maintenanceMarginRatio = initSettings.maintenanceMarginRatio
(i) (w) 🔗 MarketLib.init | 🎯#L119 | settings.liquidationFeeRate = initSettings.liquidationFeeRate
(i) (w) 🔗 MarketLib.init | 🎯#L120 | settings.divergenceCap = initSettings.divergenceCap
(i) (w) 🔗 MarketLib.init | 🎯#L121 | settings.reduceOnlyCap = initSettings.reduceOnlyCap
(i) (w) 🔗 MarketLib.init | 🎯#L122 | settings.partialLiquidationThreshold = initSettings.partialLiquidationThreshold
(i) (w) 🔗 MarketLib.init | 🎯#L123 | settings.partialLiquidationRate = initSettings.partialLiquidationRate
    (🔀?settings.status?)  (w) 🔗 CLOBStorageLib.init | 🎯#L543 | ss.status = marketSettings.status
    (🔀?settings.status?)  (w) 🔗 CLOBStorageLib.init | 🎯#L543 | ss.status = marketSettings.status
    (🔀?settings.maintenanceMarginRatio?)  (w) 🔗 AdminPanel.setMinMarginRatio | 🎯💥❌ ['onlyAdmin']#L455 | settings.maintenanceMarginRatio = maintenanceMarginRatio

(storage) MarketLib.placeOrder(Market,address,PlaceOrderArgs,BookType).self |
(i) (r) 🔗 MarketLib.placeOrder | 🎯❌ ['onlyActiveMarket(bytes32)']#L139 | _validateReduceOnlyOrder({self:self,account:account,subaccount:args.subaccount,orderAmount:args.amount,side:args.side,baseDenominated:args.baseDenominated})
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong

(storage) MarketLib.amendLimitOrder(Market,address,AmendLimitOrderArgs,BookType).self |
(i) (r) 🔗 MarketLib.amendLimitOrder | 🎯❌ ['onlyActiveMarket(bytes32)']#L157 | _validateReduceOnlyOrder(self,account,args.subaccount,args.baseAmount,args.side,true)
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong

(storage) MarketLib.liquidate(Market,address,uint256,Side,uint256,BookType).self |
(i) (r*) 🔗 MarketLib.liquidate | 🎯#L176 | result = CLOBLib.placeOrder(account,PlaceOrderArgs({subaccount:subaccount,asset:self.asset,side:side,limitPrice:0,amount:amount,baseDenominated:true,tif:TiF.IOC,expiryTime:0,clientOrderId:0,reduceOnly:true}),bookType)
(i) (r) 🔗 MarketLib.liquidate | 🎯#L174 | amount = _getLiquidationAmount(self,amount)
(i) (r) 🔗 MarketLib._getLiquidationAmount | 🎯🟩#L571 | positionAmount.fullMulDiv(self.markPrice,1e18) < StorageLib.loadMarketSettings(self.asset).partialLiquidationThreshold

(storage) MarketLib.settleFunding(Market).self |
(w) 🔗 FundingLib._calcFundingIndex | 🎯#L113 | self.resetIterationsLeft = settings.resetIterations
(w) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | -- self.resetIterationsLeft
(w) 🔗 FundingLib.settleFunding | 🎯#L51 | self.lastFundingTime = block.timestamp
(w) 🔗 FundingLib.settleFunding | 🎯#L62 | self.fundingRate = fundingRate
(r*) 🔗 FundingLib.settleFunding | 🎯#L54 | (fundingIndex,fundingRate) = _calcFundingIndex({self:self,settings:settings,markTwap:markTwap.toInt256(),indexTwap:indexTwap.toInt256()})
(i) (r*) 🔗 MarketLib.settleFunding | 🎯#L206 | (funding,cumulativeFunding) = fundingRateEngine.settleFunding({asset:asset,markTwap:metadata.markPriceHistory.twap(interval),indexTwap:metadata.indexPriceHistory.twap(interval)})
(r) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | self.resetIterationsLeft > 0
(r) 🔗 FundingLib.settleFunding | 🎯#L61 | cumulativeFundingIndex = self.cumulativeFundingIndex += fundingIndex
(r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L88 | elapsedTime = self.getTimeSinceLastFunding()
(r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L89 | interval = self.getFundingInterval(asset)
(i) (r) 🔗 MarketLib.settleFunding | 🎯#L199 | asset = self.asset
(i) (r) 🔗 MarketLib.settleFunding | 🎯#L201 | fundingRateEngine = StorageLib.loadFundingRateEngine(asset)
(i) (r) 🔗 MarketLib.settleFunding | 🎯#L202 | metadata = StorageLib.loadMarketMetadata(asset)
(i) (r) 🔗 MarketLib.settleFunding | 🎯#L204 | interval = fundingRateEngine.getTimeSinceLastFunding()
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L53 | idx = history.snapshots.length
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L57 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L62 | timePeriod = block.timestamp - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L63 | elapsedTime = timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L64 | weightedPrice = currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L65 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L67 | currentSnapshot.timestamp > targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L71 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L73 | currentSnapshot.timestamp < targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L75 | elapsedTime += timePeriod = previousTime - targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L77 | elapsedTime += timePeriod = previousTime - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L80 | weightedPrice += currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L81 | previousTime = currentSnapshot.timestamp

(storage) MarketLib.settleFunding(Market).fundingRateEngine | StorageLib.loadFundingRateEngine(asset)
(w) 🔗 FundingLib._calcFundingIndex | 🎯#L113 | self.resetIterationsLeft = settings.resetIterations
(w) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | -- self.resetIterationsLeft
(w) 🔗 FundingLib.settleFunding | 🎯#L51 | self.lastFundingTime = block.timestamp
(w) 🔗 FundingLib.settleFunding | 🎯#L62 | self.fundingRate = fundingRate
(i) (w) 🔗 MarketLib.settleFunding | 🎯#L201 | fundingRateEngine = StorageLib.loadFundingRateEngine(asset)
(r*) 🔗 FundingLib.settleFunding | 🎯#L54 | (fundingIndex,fundingRate) = _calcFundingIndex({self:self,settings:settings,markTwap:markTwap.toInt256(),indexTwap:indexTwap.toInt256()})
(i) (r*) 🔗 MarketLib.settleFunding | 🎯#L206 | (funding,cumulativeFunding) = fundingRateEngine.settleFunding({asset:asset,markTwap:metadata.markPriceHistory.twap(interval),indexTwap:metadata.indexPriceHistory.twap(interval)})
(r) 🔗 FundingLib._calcFundingIndex | 🎯#L114 | self.resetIterationsLeft > 0
(r) 🔗 FundingLib.settleFunding | 🎯#L61 | cumulativeFundingIndex = self.cumulativeFundingIndex += fundingIndex
(r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L88 | elapsedTime = self.getTimeSinceLastFunding()
(r) 🔗 FundingLib.assertFundingIntervalElapsed | 🎯🟩#L89 | interval = self.getFundingInterval(asset)
(i) (r) 🔗 MarketLib.settleFunding | 🎯#L204 | interval = fundingRateEngine.getTimeSinceLastFunding()

(storage) MarketLib.settleFunding(Market).metadata | StorageLib.loadMarketMetadata(asset)
(i) (w) 🔗 MarketLib.settleFunding | 🎯#L202 | metadata = StorageLib.loadMarketMetadata(asset)
(i) (r*) 🔗 MarketLib.settleFunding | 🎯#L206 | (funding,cumulativeFunding) = fundingRateEngine.settleFunding({asset:asset,markTwap:metadata.markPriceHistory.twap(interval),indexTwap:metadata.indexPriceHistory.twap(interval)})
(i) (r) 🔗 MarketLib.settleFunding | 🎯#L212 | FundingSettled({asset:asset,funding:funding,cumulativeFunding:cumulativeFunding,openInterest:metadata.longOI,nonce:StorageLib.incNonce()})
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L53 | idx = history.snapshots.length
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L57 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L62 | timePeriod = block.timestamp - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L63 | elapsedTime = timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L64 | weightedPrice = currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L65 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L67 | currentSnapshot.timestamp > targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L71 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L73 | currentSnapshot.timestamp < targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L75 | elapsedTime += timePeriod = previousTime - targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L77 | elapsedTime += timePeriod = previousTime - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L80 | weightedPrice += currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L81 | previousTime = currentSnapshot.timestamp

(storage) MarketLib.setMarkPrice(Market,uint256).self |
(i) (w) 🔗 MarketLib.setMarkPrice | 🎯#L231 | self.markPrice = markPrice = _getMedian(p1,p2,p3)
(w) 🔗 PriceHistoryLib.snapshot | 🎯#L30 | history.snapshots[length - 1].price = price
(w) 🔗 PriceHistoryLib.snapshot | 🎯#L32 | history.snapshots.push(PriceSnapshot(price,0,block.timestamp))
(w) 🔗 PriceHistoryLib.snapshotBasisSpread | 🎯#L37 | history.snapshots.push(PriceSnapshot(0,basisSpread,0))
(i) (r*) 🔗 MarketLib.setMarkPrice | 🎯#L224 | _cacheBasisSpread(self,indexPrice)
(i) (r*) 🔗 MarketLib.setMarkPrice | 🎯#L225 | _cacheImpactPrice(self)
(i) (r*) 🔗 MarketLib.setMarkPrice | 🎯#L233 | metadata.markPriceHistory.snapshot(markPrice)
(i) (r*) 🔗 MarketLib.setMarkPrice | 🎯#L234 | metadata.indexPriceHistory.snapshot(indexPrice)
(i) (r*) 🔗 MarketLib._cacheBasisSpread | 🎯#L625 | StorageLib.loadMarketMetadata(self.asset).basisSpreadHistory.snapshotBasisSpread(basisSpread)
(i) (r*) 🔗 MarketLib._cacheImpactPrice | 🎯#L635 | StorageLib.loadMarketMetadata(self.asset).impactPriceHistory.snapshot(impactPrice)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L217 | bestAsk = self.getBestAsk()
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L222 | bestAsk == type()(uint256).max
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L224 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.askLimits[bestAsk],bestAsk,quoteAmount)
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L226 | baseAmount += baseFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L227 | quoteUsed += quoteFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L228 | quoteAmount -= quoteFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L229 | bestAsk = self.getNextBiggestPrice(bestAsk,Side.SELL)
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L259 | bestBid = self.getBestBid()
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L266 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.bidLimits[bestBid],bestBid,quoteAmount)
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L268 | baseAmount += baseFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L269 | quoteUsed += quoteFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L270 | quoteAmount -= quoteFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L271 | bestBid = self.getNextSmallestPrice(bestBid,Side.BUY)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L484 | numOrders = limit.numOrders
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L485 | orderId = limit.headOrder
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L490 | orderId.unwrap() == 0
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L492 | fillAmount = self.orders[orderId].amount.min(quoteAmount.fullMulDiv(1e18,price))
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L494 | baseAmount += fillAmount
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L495 | quoteUsed += fillAmount.fullMulDiv(price,1e18)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L496 | quoteAmount -= fillAmount.fullMulDiv(price,1e18)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L498 | orderId = self.orders[orderId].nextOrderId
(r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(i) (r) 🔗 MarketLib.setMarkPrice | 🎯#L222 | metadata = StorageLib.loadMarketMetadata(self.asset)
(i) (r) 🔗 MarketLib.setMarkPrice | 🎯#L227 | p1 = self.getFundingRateComponent(indexPrice)
(i) (r) 🔗 MarketLib.setMarkPrice | 🎯#L228 | p2 = (indexPrice.toInt256() + self.getBasisSpreadEMA()).toUint256()
(i) (r) 🔗 MarketLib.setMarkPrice | 🎯#L229 | p3 = self.getImpactPriceTwap()
(i) (r) 🔗 MarketLib.setMarkPrice | 🎯#L236 | MarkPriceUpdated({asset:self.asset,markPrice:markPrice,p1:p1,p2:p2,p3:p3,nonce:StorageLib.incNonce()})
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L422 | (baseAmount,quoteUsed) = StorageLib.loadBook(self.asset).quoteBidInQuote(impactNotional)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L424 | baseAmount += (impactNotional - quoteUsed).fullMulDiv(1e18,type()(uint256).max)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L424 | impactNotional > quoteUsed
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L426 | impactBid = impactNotional.fullMulDiv(1e18,baseAmount)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L428 | (baseAmount,quoteUsed) = StorageLib.loadBook(self.asset).quoteAskInQuote(impactNotional)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L430 | baseAmount += (impactNotional - quoteUsed).fullMulDiv(1e18,1)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L430 | impactNotional > quoteUsed
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L432 | impactAsk = impactNotional.fullMulDiv(1e18,baseAmount)
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L438 | asset = self.asset
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L440 | bestBid = StorageLib.loadBook(asset).getBestBid()
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L441 | bestAsk = StorageLib.loadBook(asset).getBestAsk()
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L443 | bestAsk == type()(uint256).max || bestBid == 0
(i) (r) 🔗 MarketLib.getFundingRateComponent | 🎯🟩#L454 | fundingRateEngine = StorageLib.loadFundingRateEngine(asset)
(i) (r) 🔗 MarketLib.getImpactPriceTwap | 🎯🟩#L470 | asset = self.asset
(i) (r) 🔗 MarketLib._cacheBasisSpread | 🎯#L619 | midPrice = self.getMidPrice()
(i) (r) 🔗 MarketLib._cacheBasisSpread | 🎯#L623 | basisSpread = midPrice.toInt256() - indexPrice.toInt256()
(i) (r) 🔗 MarketLib._cacheImpactPrice | 🎯#L630 | impactNotional = uint256(500e18).fullMulDiv(StorageLib.loadMarketSettings(self.asset).maxOpenLeverage,1e18)
(i) (r) 🔗 MarketLib._cacheImpactPrice | 🎯#L633 | impactPrice = self.getImpactPrice(impactNotional)
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L103 | pWad = history.snapshots[i].basisSpread * 1e18
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L104 | _ema = (pWad * k + _ema * (1e18 - k)) / 1e18
(r) 🔗 PriceHistoryLib.snapshot | 🎯#L27 | length = history.snapshots.length
(r) 🔗 PriceHistoryLib.snapshot | 🎯#L29 | length > 0 && history.snapshots[length - 1].timestamp == block.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L53 | idx = history.snapshots.length
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L57 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L62 | timePeriod = block.timestamp - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L63 | elapsedTime = timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L64 | weightedPrice = currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L65 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L67 | currentSnapshot.timestamp > targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L71 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L73 | currentSnapshot.timestamp < targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L75 | elapsedTime += timePeriod = previousTime - targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L77 | elapsedTime += timePeriod = previousTime - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L80 | weightedPrice += currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L81 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L89 | n = history.snapshots.length
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L90 | n == 0 || period == 0
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L94 | start = n - count
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L99 | _ema = history.snapshots[start].basisSpread * 1e18
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) MarketLib.setMarkPrice(Market,uint256).metadata | StorageLib.loadMarketMetadata(self.asset)
(i) (w) 🔗 MarketLib.setMarkPrice | 🎯#L222 | metadata = StorageLib.loadMarketMetadata(self.asset)
(w) 🔗 PriceHistoryLib.snapshot | 🎯#L30 | history.snapshots[length - 1].price = price
(w) 🔗 PriceHistoryLib.snapshot | 🎯#L32 | history.snapshots.push(PriceSnapshot(price,0,block.timestamp))
(i) (r*) 🔗 MarketLib.setMarkPrice | 🎯#L233 | metadata.markPriceHistory.snapshot(markPrice)
(i) (r*) 🔗 MarketLib.setMarkPrice | 🎯#L234 | metadata.indexPriceHistory.snapshot(indexPrice)
(r) 🔗 PriceHistoryLib.snapshot | 🎯#L27 | length = history.snapshots.length
(r) 🔗 PriceHistoryLib.snapshot | 🎯#L29 | length > 0 && history.snapshots[length - 1].timestamp == block.timestamp

(storage) MarketLib.updateOI(bytes32,OIDelta).metadata | StorageLib.loadMarketMetadata(asset)
(i) (w) 🔗 MarketLib.updateOI | 🎯#L255 | metadata = StorageLib.loadMarketMetadata(asset)
(i) (w) 🔗 MarketLib.updateOI | 🎯#L257 | metadata.longOI += oiDelta.long.abs()
(i) (w) 🔗 MarketLib.updateOI | 🎯#L258 | metadata.longOI -= oiDelta.long.abs()
(i) (w) 🔗 MarketLib.updateOI | 🎯#L260 | metadata.shortOI += oiDelta.short.abs()
(i) (w) 🔗 MarketLib.updateOI | 🎯#L261 | metadata.shortOI -= oiDelta.short.abs()

(storage) MarketLib.setPosition(Market,address,uint256,Position).self |
(i) (w) 🔗 MarketLib.setPosition | 🎯#L265 | self.position[account][subaccount] = position

(storage) MarketLib.cancelCloseOrders(Market,address,uint256).self |
(i) (w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(i) (w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 MarketLib.cancelCloseOrders | 🎯#L269 | _cancelReduceOnlyOrdersStandard(self,account,subaccount)
(i) (r*) 🔗 MarketLib.cancelCloseOrders | 🎯#L270 | _cancelReduceOnlyOrdersBackstop(self,account,subaccount)
(i) (r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(i) (r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]
(i) (r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]

(storage) MarketLib.linkReduceOnlyOrder(Market,address,uint256,uint256,BookType).self |
(i) (w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(i) (w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(i) (r*) 🔗 MarketLib.linkReduceOnlyOrder | 🎯#L280 | _linkReduceOnlyStandard(self,account,subaccount,orderId)
(i) (r*) 🔗 MarketLib.linkReduceOnlyOrder | 🎯#L281 | _linkReduceOnlyBackstop(self,account,subaccount,orderId)
(i) (r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(i) (r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)
(i) (r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(i) (r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)

(storage) MarketLib.unlinkReduceOnlyOrder(Market,address,uint256,uint256,BookType).self |
(i) (w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(i) (r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L291 | _unlinkIdFromArray(self.reduceOnlyOrders[account][subaccount],orderId)
(i) (r*) 🔗 MarketLib.unlinkReduceOnlyOrder | 🎯#L292 | _unlinkIdFromArray(self.reduceOnlyOrdersBackstopBook[account][subaccount],orderId)
(i) (r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(i) (r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max

(storage) MarketLib.updateOrderbookNotional(Market,address,uint256,int256).self |
(i) (w) 🔗 MarketLib.updateOrderbookNotional | 🎯#L298 | self.orderbookNotional[account][subaccount] += notionalDelta.abs()
(i) (w) 🔗 MarketLib.updateOrderbookNotional | 🎯#L299 | self.orderbookNotional[account][subaccount] -= notionalDelta.abs()

(storage) MarketLib.getUpnl(Market,address,uint256).self |
(i) (r) 🔗 MarketLib.getUpnl | 🎯🟩#L307 | position = self.position[account][subaccount]
(i) (r) 🔗 MarketLib.getUpnl | 🎯🟩#L309 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(i) (r) 🔗 MarketLib.getUpnl | 🎯🟩#L311 | _calcUpnl(position.isLong,position.openNotional,currentNotional)

(storage) MarketLib.getUpnl(Market,address,uint256).position | self.position[account][subaccount]
(i) (w) 🔗 MarketLib.getUpnl | 🎯🟩#L307 | position = self.position[account][subaccount]
(i) (r) 🔗 MarketLib.getUpnl | 🎯🟩#L309 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(i) (r) 🔗 MarketLib.getUpnl | 🎯🟩#L311 | _calcUpnl(position.isLong,position.openNotional,currentNotional)

(storage) MarketLib.getUpnlAndMinMargin(Market,Position,BookType).self |
(i) (r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L321 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(i) (r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L323 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(i) (r) 🔗 MarketLib.getUpnlAndMinMargin | 🎯🟩#L324 | minMargin = currentNotional.fullMulDiv(self.getMinMarginRatio(bookType),1e18)

(storage) MarketLib.getNotionalValue(Market,Position).self |
(i) (r) 🔗 MarketLib.getNotionalValue | 🎯🟩#L328 | position.amount.fullMulDiv(self.markPrice,1e18)

(storage) MarketLib.getIntendedMargin(Market,Position).self |
(i) (r) 🔗 MarketLib.getIntendedMargin | 🎯🟩#L338 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(i) (r) 🔗 MarketLib.getIntendedMargin | 🎯🟩#L340 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)

(storage) MarketLib.getMinOpenMargin(Market,uint256).self |
(i) (r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L348 | positionNotional = positionAmount.fullMulDiv(self.markPrice,1e18)
(i) (r) 🔗 MarketLib.getMinOpenMargin | 🎯🟩#L350 | minOpenMargin = positionNotional.fullMulDiv(1e18,StorageLib.loadMarketSettings(self.asset).maxOpenLeverage)

(storage) MarketLib.getIntendedMarginAndUpnl(Market,Position).self |
(i) (r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L360 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)
(i) (r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L362 | upnl = _calcUpnl(position.isLong,position.openNotional,currentNotional)
(i) (r) 🔗 MarketLib.getIntendedMarginAndUpnl | 🎯🟩#L363 | intendedMargin = currentNotional.fullMulDiv(1e18,position.leverage)

(storage) MarketLib.getUpnl(Market,Position).self |
(i) (r) 🔗 MarketLib.getUpnl | 🎯🟩#L367 | currentNotional = position.amount.fullMulDiv(self.markPrice,1e18)

(storage) MarketLib.getPosition(Market,address,uint256).self |
(i) (r) 🔗 MarketLib.getPosition | 🎯🟩#L377 | position = self.position[account][subaccount]
(i) (r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage = 1e18
(i) (r) 🔗 MarketLib.getPosition | 🎯🟩#L379 | position.leverage == 0

(storage) MarketLib.getPositionLeverage(Market,address,uint256).self |
(i) (r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage

(storage) MarketLib.getMaintenanceMargin(Market,uint256).self |
(i) (r) 🔗 MarketLib.getMaintenanceMargin | 🎯🟩#L393 | positionAmount.fullMulDiv(self.markPrice,1e18).fullMulDiv(StorageLib.loadMarketSettings(self.asset).maintenanceMarginRatio,1e18)

(storage) MarketLib.getFundingPayment(Market,address,uint256).self |
(i) (r) 🔗 MarketLib.getFundingPayment | 🎯🟩#L403 | position = self.position[account][subaccount]
(i) (r) 🔗 MarketLib.getFundingPayment | 🎯🟩#L404 | position.realizeFundingPayment(StorageLib.loadFundingRateEngine(self.asset).getCumulativeFunding())

(storage) MarketLib.getFundingPayment(Market,address,uint256).position | self.position[account][subaccount]
(i) (w) 🔗 MarketLib.getFundingPayment | 🎯🟩#L403 | position = self.position[account][subaccount]
(i) (r) 🔗 MarketLib.getFundingPayment | 🎯🟩#L404 | position.realizeFundingPayment(StorageLib.loadFundingRateEngine(self.asset).getCumulativeFunding())

(storage) MarketLib.getMaxDivergingBidPrice(Market).self |
(i) (r) 🔗 MarketLib.getMaxDivergingBidPrice | 🎯🟩#L408 | mark = self.markPrice
(i) (r) 🔗 MarketLib.getMaxDivergingBidPrice | 🎯🟩#L409 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)

(storage) MarketLib.getMaxDivergingAskPrice(Market).self |
(i) (r) 🔗 MarketLib.getMaxDivergingAskPrice | 🎯🟩#L415 | mark = self.markPrice
(i) (r) 🔗 MarketLib.getMaxDivergingAskPrice | 🎯🟩#L416 | maxDivergence = mark.fullMulDiv(StorageLib.loadMarketSettings(self.asset).divergenceCap,1e18)

(storage) MarketLib.getImpactPrice(Market,uint256).self |
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L217 | bestAsk = self.getBestAsk()
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L222 | bestAsk == type()(uint256).max
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L224 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.askLimits[bestAsk],bestAsk,quoteAmount)
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L226 | baseAmount += baseFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L227 | quoteUsed += quoteFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L228 | quoteAmount -= quoteFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L229 | bestAsk = self.getNextBiggestPrice(bestAsk,Side.SELL)
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L259 | bestBid = self.getBestBid()
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L266 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.bidLimits[bestBid],bestBid,quoteAmount)
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L268 | baseAmount += baseFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L269 | quoteUsed += quoteFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L270 | quoteAmount -= quoteFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L271 | bestBid = self.getNextSmallestPrice(bestBid,Side.BUY)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L484 | numOrders = limit.numOrders
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L485 | orderId = limit.headOrder
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L490 | orderId.unwrap() == 0
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L492 | fillAmount = self.orders[orderId].amount.min(quoteAmount.fullMulDiv(1e18,price))
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L494 | baseAmount += fillAmount
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L495 | quoteUsed += fillAmount.fullMulDiv(price,1e18)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L496 | quoteAmount -= fillAmount.fullMulDiv(price,1e18)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L498 | orderId = self.orders[orderId].nextOrderId
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L422 | (baseAmount,quoteUsed) = StorageLib.loadBook(self.asset).quoteBidInQuote(impactNotional)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L424 | baseAmount += (impactNotional - quoteUsed).fullMulDiv(1e18,type()(uint256).max)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L424 | impactNotional > quoteUsed
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L426 | impactBid = impactNotional.fullMulDiv(1e18,baseAmount)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L428 | (baseAmount,quoteUsed) = StorageLib.loadBook(self.asset).quoteAskInQuote(impactNotional)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L430 | baseAmount += (impactNotional - quoteUsed).fullMulDiv(1e18,1)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L430 | impactNotional > quoteUsed
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L432 | impactAsk = impactNotional.fullMulDiv(1e18,baseAmount)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) MarketLib.getMidPrice(Market).self |
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L438 | asset = self.asset
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L440 | bestBid = StorageLib.loadBook(asset).getBestBid()
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L441 | bestAsk = StorageLib.loadBook(asset).getBestAsk()
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L443 | bestAsk == type()(uint256).max || bestBid == 0
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) MarketLib.getFundingRateComponent(Market,uint256).self |
(r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(i) (r) 🔗 MarketLib.getFundingRateComponent | 🎯🟩#L454 | fundingRateEngine = StorageLib.loadFundingRateEngine(asset)

(storage) MarketLib.getFundingRateComponent(Market,uint256).fundingRateEngine | StorageLib.loadFundingRateEngine(asset)
(i) (w) 🔗 MarketLib.getFundingRateComponent | 🎯🟩#L454 | fundingRateEngine = StorageLib.loadFundingRateEngine(asset)
(r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(i) (r) 🔗 MarketLib.getFundingRateComponent | 🎯🟩#L456 | indexPrice.fullMulDiv(1e18 + fundingRateEngine.fundingRate.abs().fullMulDiv(block.timestamp - fundingRateEngine.lastFundingTime,fundingRateEngine.getFundingInterval(asset)),1e18)

(storage) MarketLib.getBasisSpreadEMA(Market).self |
(i) (r) 🔗 MarketLib.getBasisSpreadEMA | 🎯🟩#L466 | StorageLib.loadMarketMetadata(self.asset).basisSpreadHistory.ema(900)
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L103 | pWad = history.snapshots[i].basisSpread * 1e18
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L104 | _ema = (pWad * k + _ema * (1e18 - k)) / 1e18
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L89 | n = history.snapshots.length
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L90 | n == 0 || period == 0
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L94 | start = n - count
(r) 🔗 PriceHistoryLib.ema | 🎯🟩#L99 | _ema = history.snapshots[start].basisSpread * 1e18

(storage) MarketLib.getImpactPriceTwap(Market).self |
(r) 🔗 FundingLib.getFundingInterval | 🎯🟩#L72 | self.resetIterationsLeft == 0
(i) (r) 🔗 MarketLib.getImpactPriceTwap | 🎯🟩#L470 | asset = self.asset
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L53 | idx = history.snapshots.length
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L57 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L62 | timePeriod = block.timestamp - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L63 | elapsedTime = timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L64 | weightedPrice = currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L65 | previousTime = currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L67 | currentSnapshot.timestamp > targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L71 | currentSnapshot = history.snapshots[-- idx]
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L73 | currentSnapshot.timestamp < targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L75 | elapsedTime += timePeriod = previousTime - targetTime
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L77 | elapsedTime += timePeriod = previousTime - currentSnapshot.timestamp
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L80 | weightedPrice += currentSnapshot.price * timePeriod
(r) 🔗 PriceHistoryLib.twap | 🎯🟩#L81 | previousTime = currentSnapshot.timestamp

(storage) MarketLib.getOrderBookCollateral(Market,address,uint256).self |
(i) (r) 🔗 MarketLib.getPositionLeverage | 🎯🟩#L387 | leverage = self.position[account][subaccount].leverage
(i) (r) 🔗 MarketLib.getOrderBookCollateral | 🎯🟩#L482 | self.orderbookNotional[account][subaccount].fullMulDiv(1e18,self.getPositionLeverage(account,subaccount))

(storage) MarketLib.getMinMarginRatio(Market,BookType).self |
(i) (r) 🔗 MarketLib.getMinMarginRatio | 🎯🟩#L489 | StorageLib.loadMarketSettings(self.asset).maintenanceMarginRatio / denominator

(storage) MarketLib.isTPSLConditionMet(Market,Side,Condition).self |
(i) (r) 🔗 MarketLib.isTPSLConditionMet | 🎯🟩#L497 | mark = self.markPrice
(i) (r) 🔗 MarketLib.isTPSLConditionMet | 🎯🟩#L500 | mark >= condition.triggerPrice
(i) (r) 🔗 MarketLib.isTPSLConditionMet | 🎯🟩#L502 | mark <= condition.triggerPrice

(storage) MarketLib.exists(Market).self |
(i) (r) 🔗 MarketLib.exists | 🎯🟩#L507 | self.asset != bytes32(0)

(storage) MarketLib._validateReduceOnlyOrder(Market,address,uint256,uint256,Side,bool).self |
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong

(storage) MarketLib._validateReduceOnlyOrder(Market,address,uint256,uint256,Side,bool).position | self.position[account][subaccount]
(i) (w) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L538 | position = self.position[account][subaccount]
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L540 | position.amount < orderAmount
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L542 | side == Side.BUY && position.isLong
(i) (r) 🔗 MarketLib._validateReduceOnlyOrder | 🎯🟩#L543 | side == Side.SELL && ! position.isLong

(storage) MarketLib._linkReduceOnlyStandard(Market,address,uint256,uint256).self |
(i) (w) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L554 | self.reduceOnlyOrders[account][subaccount].push(orderId)
(i) (r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L550 | self.reduceOnlyOrders[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(i) (r) 🔗 MarketLib._linkReduceOnlyStandard | 🎯#L553 | self.reduceOnlyOrders[account][subaccount].contains(orderId)

(storage) MarketLib._linkReduceOnlyBackstop(Market,address,uint256,uint256).self |
(i) (w) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L566 | self.reduceOnlyOrdersBackstopBook[account][subaccount].push(orderId)
(i) (r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L561 | self.reduceOnlyOrdersBackstopBook[account][subaccount].length >= StorageLib.loadMarketSettings(self.asset).reduceOnlyCap
(i) (r) 🔗 MarketLib._linkReduceOnlyBackstop | 🎯#L565 | self.reduceOnlyOrdersBackstopBook[account][subaccount].contains(orderId)

(storage) MarketLib._getLiquidationAmount(Market,uint256).self |
(i) (r) 🔗 MarketLib._getLiquidationAmount | 🎯🟩#L571 | positionAmount.fullMulDiv(self.markPrice,1e18) < StorageLib.loadMarketSettings(self.asset).partialLiquidationThreshold
(i) (r) 🔗 MarketLib._getLiquidationAmount | 🎯🟩#L575 | positionAmount.fullMulDiv(StorageLib.loadMarketSettings(self.asset).partialLiquidationRate,1e18)

(storage) MarketLib._cancelReduceOnlyOrdersStandard(Market,address,uint256).self |
(i) (w) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L585 | delete self.reduceOnlyOrders[account][subaccount]
(i) (r*) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L583 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.STANDARD)
(i) (r) 🔗 MarketLib._cancelReduceOnlyOrdersStandard | 🎯#L579 | orderIds = self.reduceOnlyOrders[account][subaccount]

(storage) MarketLib._cancelReduceOnlyOrdersBackstop(Market,address,uint256).self |
(i) (w) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L595 | delete self.reduceOnlyOrdersBackstopBook[account][subaccount]
(i) (r*) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L593 | CLOBLib.cancel(self.asset,account,subaccount,orderIds,BookType.BACKSTOP)
(i) (r) 🔗 MarketLib._cancelReduceOnlyOrdersBackstop | 🎯#L589 | orderIds = self.reduceOnlyOrdersBackstopBook[account][subaccount]

(storage) MarketLib._unlinkIdFromArray(uint256[],uint256).ids |
(i) (w) 🔗 MarketLib._unlinkIdFromArray | 🎯#L608 | ids[index] = ids[ids.length - 1]
(i) (r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L604 | index = ids.indexOf(id)
(i) (r) 🔗 MarketLib._unlinkIdFromArray | 🎯#L606 | index == type()(uint256).max

(storage) MarketLib._cacheBasisSpread(Market,uint256).self |
(w) 🔗 PriceHistoryLib.snapshotBasisSpread | 🎯#L37 | history.snapshots.push(PriceSnapshot(0,basisSpread,0))
(i) (r*) 🔗 MarketLib._cacheBasisSpread | 🎯#L625 | StorageLib.loadMarketMetadata(self.asset).basisSpreadHistory.snapshotBasisSpread(basisSpread)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L438 | asset = self.asset
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L440 | bestBid = StorageLib.loadBook(asset).getBestBid()
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L441 | bestAsk = StorageLib.loadBook(asset).getBestAsk()
(i) (r) 🔗 MarketLib.getMidPrice | 🎯🟩#L443 | bestAsk == type()(uint256).max || bestBid == 0
(i) (r) 🔗 MarketLib._cacheBasisSpread | 🎯#L619 | midPrice = self.getMidPrice()
(i) (r) 🔗 MarketLib._cacheBasisSpread | 🎯#L623 | basisSpread = midPrice.toInt256() - indexPrice.toInt256()
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) MarketLib._cacheImpactPrice(Market).self |
(w) 🔗 PriceHistoryLib.snapshot | 🎯#L30 | history.snapshots[length - 1].price = price
(w) 🔗 PriceHistoryLib.snapshot | 🎯#L32 | history.snapshots.push(PriceSnapshot(price,0,block.timestamp))
(i) (r*) 🔗 MarketLib._cacheImpactPrice | 🎯#L635 | StorageLib.loadMarketMetadata(self.asset).impactPriceHistory.snapshot(impactPrice)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L25 | result = RedBlackTreeLib.first(tree.tree)
(r) 🔗 BookRedBlackTreeLib.minimum | 🎯🟩#L27 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L34 | result = RedBlackTreeLib.last(tree.tree)
(r) 🔗 BookRedBlackTreeLib.maximum | 🎯🟩#L36 | result == bytes32(0)
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L48 | nodeKey == tree.maximum()
(r) 🔗 BookRedBlackTreeLib.getNextBiggest | 🎯🟩#L51 | result = RedBlackTreeLib.nearestAfter(tree.tree,nodeKey + 1)
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L58 | nodeKey == tree.minimum()
(r) 🔗 BookRedBlackTreeLib.getNextSmallest | 🎯🟩#L61 | result = RedBlackTreeLib.nearestBefore(tree.tree,nodeKey - 1)
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L217 | bestAsk = self.getBestAsk()
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L222 | bestAsk == type()(uint256).max
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L224 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.askLimits[bestAsk],bestAsk,quoteAmount)
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L226 | baseAmount += baseFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L227 | quoteUsed += quoteFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L228 | quoteAmount -= quoteFromLimit
(r) 🔗 BookLib.quoteBidInQuote | 🎯🟩#L229 | bestAsk = self.getNextBiggestPrice(bestAsk,Side.SELL)
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L259 | bestBid = self.getBestBid()
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L266 | (baseFromLimit,quoteFromLimit) = _getBaseLimit(self,self.bidLimits[bestBid],bestBid,quoteAmount)
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L268 | baseAmount += baseFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L269 | quoteUsed += quoteFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L270 | quoteAmount -= quoteFromLimit
(r) 🔗 BookLib.quoteAskInQuote | 🎯🟩#L271 | bestBid = self.getNextSmallestPrice(bestBid,Side.BUY)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L484 | numOrders = limit.numOrders
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L485 | orderId = limit.headOrder
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L490 | orderId.unwrap() == 0
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L492 | fillAmount = self.orders[orderId].amount.min(quoteAmount.fullMulDiv(1e18,price))
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L494 | baseAmount += fillAmount
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L495 | quoteUsed += fillAmount.fullMulDiv(price,1e18)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L496 | quoteAmount -= fillAmount.fullMulDiv(price,1e18)
(r) 🔗 BookLib._getBaseLimit | 🎯🟩#L498 | orderId = self.orders[orderId].nextOrderId
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L422 | (baseAmount,quoteUsed) = StorageLib.loadBook(self.asset).quoteBidInQuote(impactNotional)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L424 | baseAmount += (impactNotional - quoteUsed).fullMulDiv(1e18,type()(uint256).max)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L424 | impactNotional > quoteUsed
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L426 | impactBid = impactNotional.fullMulDiv(1e18,baseAmount)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L428 | (baseAmount,quoteUsed) = StorageLib.loadBook(self.asset).quoteAskInQuote(impactNotional)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L430 | baseAmount += (impactNotional - quoteUsed).fullMulDiv(1e18,1)
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L430 | impactNotional > quoteUsed
(i) (r) 🔗 MarketLib.getImpactPrice | 🎯🟩#L432 | impactAsk = impactNotional.fullMulDiv(1e18,baseAmount)
(i) (r) 🔗 MarketLib._cacheImpactPrice | 🎯#L630 | impactNotional = uint256(500e18).fullMulDiv(StorageLib.loadMarketSettings(self.asset).maxOpenLeverage,1e18)
(i) (r) 🔗 MarketLib._cacheImpactPrice | 🎯#L633 | impactPrice = self.getImpactPrice(impactNotional)
(r) 🔗 PriceHistoryLib.snapshot | 🎯#L27 | length = history.snapshots.length
(r) 🔗 PriceHistoryLib.snapshot | 🎯#L29 | length > 0 && history.snapshots[length - 1].timestamp == block.timestamp
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)
(r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

Solidity Vars Used

msg.sender
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])
this @ 🔗 GTL.orderbookCollateral#219:13 | 🎯💥🟢🟩🌀 | collateral += IViewPort(perpManager).getOrderbookCollateral(address(this),subaccounts[i])

block.timestamp
block.timestamp @ 🔗 MarketLib.init#111:9 | 🎯 | StorageLib.loadFundingRateEngine(asset).lastFundingTime = block.timestamp
block.timestamp @ 🔗 PriceHistoryLib.snapshot#29:13 | 🎯 | length > 0 && history.snapshots[length - 1].timestamp == block.timestamp
block.timestamp @ 🔗 PriceHistoryLib.snapshot#32:13 | 🎯 | history.snapshots.push(PriceSnapshot(price,0,block.timestamp))
block.timestamp @ 🔗 MarketLib.getFundingRateComponent#456:9 | 🎯🟩 | indexPrice.fullMulDiv(1e18 + fundingRateEngine.fundingRate.abs().fullMulDiv(block.timestamp - fundingRateEngine.lastFundingTime,fundingRateEngine.getFundingInterval(asset)),1e18)
block.timestamp @ 🔗 PriceHistoryLib.twap#61:9 | 🎯🟩 | targetTime = block.timestamp - twapInterval
block.timestamp @ 🔗 PriceHistoryLib.twap#62:9 | 🎯🟩 | timePeriod = block.timestamp - currentSnapshot.timestamp
block.timestamp @ 🔗 FundingLib.settleFunding#51:9 | 🎯 | self.lastFundingTime = block.timestamp
block.timestamp @ 🔗 FundingLib.getTimeSinceLastFunding#80:9 | 🎯🟩 | block.timestamp - self.lastFundingTime
block.timestamp @ 🔗 OrderLib.isExpired#92:9 | 🎯🟩 | self.expiryTime != NULL_TIMESTAMP && self.expiryTime < block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#97:9 | 🎯🟩 | expiryTime != NULL_TIMESTAMP && expiryTime < block.timestamp

modifiers_html

functions_html

OrderIdLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/Order.sol#11:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

modifiers_html

functions_html

OrderLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/Order.sol#52:1

state_vars_html

(storage) OrderLib.toOrder(AmendLimitOrderArgs,Order).currentOrder |
(i) (r) 🔗 OrderLib.toOrder | 🎯🟩#L80 | newOrder.owner = currentOrder.owner
(i) (r) 🔗 OrderLib.toOrder | 🎯🟩#L81 | newOrder.id = currentOrder.id
(i) (r) 🔗 OrderLib.toOrder | 🎯🟩#L86 | newOrder.subaccount = currentOrder.subaccount

Solidity Vars Used

block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#97:9 | 🎯🟩 | expiryTime != NULL_TIMESTAMP && expiryTime < block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#92:9 | 🎯🟩 | self.expiryTime != NULL_TIMESTAMP && self.expiryTime < block.timestamp

msg.sender
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

modifiers_html

functions_html

PackedFeeRatesLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/PackedFeeRatesLib.sol#8:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

modifiers_html

functions_html

PositionLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/Position.sol#20:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])

modifiers_html

functions_html

PriceHistoryLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/PriceHistory.sol#18:1

state_vars_html

(storage) PriceHistoryLib.snapshot(PriceHistory,uint256).history |
(i) (w) 🔗 PriceHistoryLib.snapshot | 🎯#L30 | history.snapshots[length - 1].price = price
(i) (w) 🔗 PriceHistoryLib.snapshot | 🎯#L32 | history.snapshots.push(PriceSnapshot(price,0,block.timestamp))
(i) (r) 🔗 PriceHistoryLib.snapshot | 🎯#L27 | length = history.snapshots.length
(i) (r) 🔗 PriceHistoryLib.snapshot | 🎯#L29 | length > 0 && history.snapshots[length - 1].timestamp == block.timestamp

(storage) PriceHistoryLib.snapshotBasisSpread(PriceHistory,int256).history |
(i) (w) 🔗 PriceHistoryLib.snapshotBasisSpread | 🎯#L37 | history.snapshots.push(PriceSnapshot(0,basisSpread,0))

(storage) PriceHistoryLib.latest(PriceHistory).history |
(i) (r) 🔗 PriceHistoryLib.latest | 🎯🟩#L45 | length = history.snapshots.length
(i) (r) 🔗 PriceHistoryLib.latest | 🎯🟩#L49 | history.snapshots[length - 1].price

(storage) PriceHistoryLib.twap(PriceHistory,uint256).history |
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L53 | idx = history.snapshots.length
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L57 | currentSnapshot = history.snapshots[-- idx]
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L62 | timePeriod = block.timestamp - currentSnapshot.timestamp
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L63 | elapsedTime = timePeriod
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L64 | weightedPrice = currentSnapshot.price * timePeriod
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L65 | previousTime = currentSnapshot.timestamp
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L67 | currentSnapshot.timestamp > targetTime
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L71 | currentSnapshot = history.snapshots[-- idx]
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L73 | currentSnapshot.timestamp < targetTime
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L75 | elapsedTime += timePeriod = previousTime - targetTime
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L77 | elapsedTime += timePeriod = previousTime - currentSnapshot.timestamp
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L80 | weightedPrice += currentSnapshot.price * timePeriod
(i) (r) 🔗 PriceHistoryLib.twap | 🎯🟩#L81 | previousTime = currentSnapshot.timestamp

(storage) PriceHistoryLib.ema(PriceHistory,uint256).history |
(i) (r) 🔗 PriceHistoryLib.ema | 🎯🟩#L102 | i = start + 1
(i) (r) 🔗 PriceHistoryLib.ema | 🎯🟩#L103 | pWad = history.snapshots[i].basisSpread * 1e18
(i) (r) 🔗 PriceHistoryLib.ema | 🎯🟩#L104 | _ema = (pWad * k + _ema * (1e18 - k)) / 1e18
(i) (r) 🔗 PriceHistoryLib.ema | 🎯🟩#L89 | n = history.snapshots.length
(i) (r) 🔗 PriceHistoryLib.ema | 🎯🟩#L90 | n == 0 || period == 0
(i) (r) 🔗 PriceHistoryLib.ema | 🎯🟩#L93 | period <= n
(i) (r) 🔗 PriceHistoryLib.ema | 🎯🟩#L94 | start = n - count
(i) (r) 🔗 PriceHistoryLib.ema | 🎯🟩#L99 | _ema = history.snapshots[start].basisSpread * 1e18

Solidity Vars Used

block.timestamp
block.timestamp @ 🔗 PriceHistoryLib.twap#61:9 | 🎯🟩 | targetTime = block.timestamp - twapInterval
block.timestamp @ 🔗 PriceHistoryLib.twap#62:9 | 🎯🟩 | timePeriod = block.timestamp - currentSnapshot.timestamp
block.timestamp @ 🔗 PriceHistoryLib.snapshot#29:13 | 🎯 | length > 0 && history.snapshots[length - 1].timestamp == block.timestamp
block.timestamp @ 🔗 PriceHistoryLib.snapshot#32:13 | 🎯 | history.snapshots.push(PriceSnapshot(price,0,block.timestamp))

modifiers_html

functions_html

StorageLib,/home/ubuntu/2025-08-gte-perps/contracts/perps/types/StorageLib.sol#17:1

state_vars_html

(storage) StorageLib.loadClearingHouse().ch |
(storage) StorageLib.loadInsuranceFund().insuranceFund |
(i) (w) 🔗 StorageLib.loadInsuranceFund | 🎯🟢🟩#L64 | insuranceFund = slot

(storage) StorageLib.loadCollateralManager().collateralManager |
(i) (w) 🔗 StorageLib.loadCollateralManager | 🎯🟢🟩#L72 | collateralManager = slot

(storage) StorageLib.loadFeeManager().feeManager |
(i) (w) 🔗 StorageLib.loadFeeManager | 🎯🟢🟩#L80 | feeManager = slot

(storage) StorageLib.loadMarket(bytes32).market |
(storage) StorageLib.loadMarketSettings(bytes32).marketSettings |
(i) (w) 🔗 StorageLib.loadMarketSettings | 🎯🟢🟩#L96 | marketSettings = slot

(storage) StorageLib.loadMarketMetadata(bytes32).marketMetadata |
(i) (w) 🔗 StorageLib.loadMarketMetadata | 🎯🟢🟩#L104 | marketMetadata = slot

(storage) StorageLib.loadFundingRateEngine(bytes32).fundingRateEngine |
(i) (w) 🔗 StorageLib.loadFundingRateEngine | 🎯🟢🟩#L112 | fundingRateEngine = slot

(storage) StorageLib.loadFundingRateSettings(bytes32).settings |
(storage) StorageLib.loadBook(bytes32).ds |
(storage) StorageLib.loadBackstopBook(bytes32).ds |
(storage) StorageLib.loadBook(bytes32,BookType).ds |
(storage) StorageLib.loadBookConfig(bytes32).bookConfig |
(storage) StorageLib.loadBookSettings(bytes32).bookSettings |
(i) (w) 🔗 StorageLib.loadBookSettings | 🎯🟢🟩#L173 | bookSettings = slot

Solidity Vars Used

msg.sender
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 PerpManager.depositTo#112:9 | 🎯💥 | StorageLib.loadCollateralManager().depositFreeCollateral({from:msg.sender,to:account,amount:amount})
msg.sender @ 🔗 PerpManager.withdrawToSpot#128:13 | 🎯💥🟢 | msg.sender != address(accountManager)
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])
this @ 🔗 GTL.orderbookCollateral#219:13 | 🎯💥🟢🟩🌀 | collateral += IViewPort(perpManager).getOrderbookCollateral(address(this),subaccounts[i])
this @ 🔗 GTL.freeCollateralBalance#224:9 | 🎯💥🟢🟩🌀 | IViewPort(perpManager).getFreeCollateralBalance(address(this))

block.timestamp
block.timestamp @ 🔗 MarketLib.init#111:9 | 🎯 | StorageLib.loadFundingRateEngine(asset).lastFundingTime = block.timestamp
block.timestamp @ 🔗 MarketLib.getFundingRateComponent#456:9 | 🎯🟩 | indexPrice.fullMulDiv(1e18 + fundingRateEngine.fundingRate.abs().fullMulDiv(block.timestamp - fundingRateEngine.lastFundingTime,fundingRateEngine.getFundingInterval(asset)),1e18)
block.timestamp @ 🔗 FundingLib.settleFunding#51:9 | 🎯 | self.lastFundingTime = block.timestamp

modifiers_html

functions_html

GTERouter,/home/ubuntu/2025-08-gte-perps/contracts/router/GTERouter.sol#22:1

state_vars_html


Solidity Vars Used

this
this @ 🔗 AccountManager.depositFromRouter#207:9 | 🎯💥🟢❌ ['onlyGTERouter'] | token.safeTransferFrom(gteRouter,address(this),amount)
this @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
this @ 🔗 Launchpad._swapRemaining#538:9 | 🎯🟢🌀 | data.quote.safeTransferFrom(msg.sender,address(this),data.quoteAmount)
this @ 🔗 ReentrancyGuardTransient.nonReentrant#41:21 | 🌈🟢 | tstore(uint256,uint256)(s,address()())
this @ 🔗 ReentrancyGuardTransient.nonReentrant#46:21 | 🌈🟢 | sload(uint256)(s) == address()()
this @ 🔗 ReentrancyGuardTransient.nonReentrant#50:21 | 🌈🟢 | sstore(uint256,uint256)(s,address()())
this @ 🔗 ReentrancyGuardTransient.nonReentrant#60:17 | 🌈🟢 | tstore(uint256,uint256)(_REENTRANCY_GUARD_SLOT,address()())
this @ 🔗 ReentrancyGuardTransient.nonReadReentrant#100:21 | 🌈🟢 | sload(uint256)(s) == address()()
this @ 🔗 GTELaunchpadV2Pair.skim#310:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))
this @ 🔗 GTELaunchpadV2Pair.skim#311:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))
this @ 🔗 ReentrancyGuard.nonReentrant#31:13 | 🌈🟢🔴 | sload(uint256)(_REENTRANCY_GUARD_SLOT) == address()()
this @ 🔗 ReentrancyGuard.nonReentrant#35:13 | 🌈🟢🔴 | sstore(uint256,uint256)(_REENTRANCY_GUARD_SLOT,address()())
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)
this @ 🔗 Launchpad.sell#359:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amountInBase)
this @ 🔗 AccountManager.deposit#186:9 | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amount)

block.timestamp
block.timestamp @ 🔗 GTERouter.inTime#91:13 | 🎯🌈 | block.timestamp > deadline
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})
block.timestamp @ 🔗 Launchpad._swapRemaining#548:9 | 🎯🟢🌀 | uniV2Router.swapTokensForExactTokens(data.baseAmount,data.quoteAmount,path,data.recipient,block.timestamp + 1)
block.timestamp @ 🔗 LaunchToken.unlock#92:9 | 🎯💥🔴❌ ['onlyLaunchpad'] | TransfersUnlocked(block.timestamp,_incEventNonce())
block.timestamp @ 🔗 OrderLib.toOrderChecked#77:13 | 🎯🟩 | uint8(args.tif) <= 1 && args.expiryTime > 0 && args.expiryTime < block.timestamp
block.timestamp @ 🔗 OrderLib.isExpired#92:9 | 🎯🟩 | self.expiryTime != NULL_TIMESTAMP && self.expiryTime < block.timestamp
block.timestamp @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)
block.timestamp @ 🔗 OrderLib.isExpired#97:9 | 🎯🟩 | expiryTime != NULL_TIMESTAMP && expiryTime < block.timestamp

msg.sender
msg.sender @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 GTERouter.spotDeposit#125:13 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.spotDeposit#127:13 | 🎯💥🟢🌀 | acctManager.deposit(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#138:9 | 🎯💥🟢🌀 | permit2.permit(msg.sender,permitSingle,signature)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#141:9 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)
msg.sender @ 🔗 AccountManager.onlyMarket#87:13 | 🎯🌈 | ! _getAccountStorage().isMarket[msg.sender]
msg.sender @ 🔗 Launchpad._swapRemaining#538:9 | 🎯🟢🌀 | data.quote.safeTransferFrom(msg.sender,address(this),data.quoteAmount)
msg.sender @ 🔗 Launchpad._swapRemaining#556:13 | 🎯🟢🌀 | data.quote.safeTransfer(msg.sender,data.quoteAmount)
msg.sender @ 🔗 Launchpad.onlySenderOrOperator#144:13 | 🎯🌈🟢 | msg.sender != gteRouter
msg.sender @ 🔗 GTERouter.spotWithdraw#153:9 | 🎯💥🟢🌀 | acctManager.withdraw(msg.sender,token,amount)
msg.sender @ 🔗 SimpleBondingCurve.onlyLaunchpad#49:13 | 🎯🌈🟢 | msg.sender != launchpad
msg.sender @ 🔗 AccountManager.onlyGTERouter#93:13 | 🎯🌈🟢 | msg.sender != gteRouter
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 LaunchToken.onlyLaunchpad#62:13 | 🎯🌈🟢 | msg.sender != launchpad
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 GTERouter.launchpadSell#188:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.sell({account:msg.sender,token:launchToken,recipient:msg.sender,amountInBase:amountInBase,minAmountOutQuote:worstAmountOutQuote})
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#22:13 | 🎯🟩🌀 | msg.sender == account || msg.sender == gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#24:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#33:13 | 🎯🟩🌀 | msg.sender == account
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#35:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#46:13 | 🎯🟩 | msg.sender == account || msg.sender == gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#48:9 | 🎯🟩 | rolesPacked = self.operatorRoleApprovals[account][msg.sender]
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#327:13 | 🎯🟢🌀 | acctManager.withdrawToRouter(msg.sender,route.nextTokenIn,route.prevAmountOut)
msg.sender @ 🔗 GTERouter._accountDepositInternal#355:9 | 🎯🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 WETH.deposit#38:9 | 💥💲 | _mint(msg.sender,msg.value)

msg.value
msg.value @ 🔗 GTERouter.wrapSpotDeposit#146:9 | 🎯💥🟢🌀💲 | weth.deposit{value: msg.value}()
msg.value @ 🔗 GTERouter.wrapSpotDeposit#147:9 | 🎯💥🟢🌀💲 | address(weth).safeApprove(address(acctManager),msg.value)
msg.value @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)
msg.value @ 🔗 WETH.deposit#38:9 | 💥💲 | _mint(msg.sender,msg.value)

block.chainid
block.chainid @ 🔗 ReentrancyGuardTransient.nonReentrant#34:17 | 🌈🟢 | block.chainid == 1
block.chainid @ 🔗 ReentrancyGuardTransient.nonReentrant#66:17 | 🌈🟢 | block.chainid == 1
block.chainid @ 🔗 ReentrancyGuardTransient.nonReadReentrant#89:17 | 🌈🟢 | block.chainid == 1

External Calls

GTERouter.spotDeposit | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender, token, amount)
GTERouter.spotDeposit | 🎯💥🟢🌀 | acctManager.deposit(msg.sender, token, amount)
GTERouter.spotDepositPermit2 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender, token, amount)
GTERouter.spotDepositPermit2 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender, address(this), amount, token)
GTERouter.spotDepositPermit2 | 🎯💥🟢🌀 | permit2.permit(msg.sender, permitSingle, signature)
GTERouter.wrapSpotDeposit | 🎯💥🟢🌀💲 | weth.deposit{value: msg.value}()
GTERouter.wrapSpotDeposit | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender, address(weth), msg.value)
GTERouter.spotWithdraw | 🎯💥🟢🌀 | acctManager.withdraw(msg.sender, token, amount)
GTERouter.clobCancel | 🎯💥🌀 ['isMarket(ICLOB)'] | return clob.cancel(msg.sender, args)
GTERouter.clobAmend | 🎯💥🌀 ['isMarket(ICLOB)'] | return clob.amend(msg.sender, args)
GTERouter.clobPlaceOrder | 🎯💥🌀 ['isMarket(ICLOB)'] | return clob.placeOrder(msg.sender, args)
GTERouter.launchpadSell | 🎯💥🟢🌀 ['nonReentrant'] | return launchpad.sell({ account: msg.sender, token: launchToken, recipient: msg.sender, amountInBase: amountInBase, minAmountOutQuote: worstAmountOutQuote })
GTERouter.launchpadBuy | 🎯💥🟢🌀 ['nonReentrant'] | return launchpad.buy( ILaunchpad.BuyData({ account: msg.sender, token: launchToken, recipient: msg.sender, amountOutBase: amountOutBase, maxAmountInQuote: worstAmountInQuote }) )
GTERouter._assertValidCLOB | 🎯🟢🟩🌀 | !clobAdminPanel.isMarket(address(clob))
GTERouter._executeClobPostFillOrder | 🎯🟢🌀 | fillArgs.side = ICLOB(market).getQuoteToken() == route.nextTokenIn ? Side.BUY : Side.SELL
GTERouter._executeClobPostFillOrder | 🎯🟢🌀 | address market = clobAdminPanel.getMarketAddress(route.nextTokenIn, tokenOut)
GTERouter._executeClobPostFillOrder | 🎯🟢🌀 | ICLOB.PlaceOrderResult memory result = ICLOB(market).placeOrder(msg.sender, fillArgs)
GTERouter._executeUniV2SwapExactTokensForTokens | 🎯🟢🌀 | acctManager.withdrawToRouter(msg.sender, route.nextTokenIn, route.prevAmountOut)
GTERouter._executeUniV2SwapExactTokensForTokens | 🎯🟢🌀 | uint256[] memory amounts = uniV2Router.swapExactTokensForTokens( route.prevAmountOut, 0, // No amountOutMin since executeRoute enforces slippage path, address(this), // Always send to router block.timestamp )
GTERouter._accountDepositInternal | 🎯🟢🌀 | acctManager.depositFromRouter(msg.sender, token, amount)


modifiers_html

functions_html

HopLib,/home/ubuntu/2025-08-gte-perps/contracts/router/GTERouter.sol#361:1

state_vars_html

modifiers_html

functions_html

IUniswapV2Router01,/home/ubuntu/2025-08-gte-perps/contracts/router/interfaces/IUniswapV2Router01.sol#4:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#327:13 | 🎯🟢🌀 | acctManager.withdrawToRouter(msg.sender,route.nextTokenIn,route.prevAmountOut)

block.timestamp
block.timestamp @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)

this
this @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)

modifiers_html

functions_html

OperatorHub,/home/ubuntu/2025-08-gte-perps/contracts/utils/OperatorHub.sol#10:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 OperatorHub.approveOperatorSpot#28:9 | 🎯💥🟢🌀 | accountManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OperatorPanel.onlySenderOrOperatorHub#73:13 | 🎯🌈🟢 | msg.sender != account && msg.sender != operatorHub
msg.sender @ 🔗 OperatorHub.approveOperatorPerps#32:9 | 🎯💥🟢🌀 | perpManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OperatorHub.disapproveOperatorSpot#36:9 | 🎯💥🟢🌀 | accountManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OperatorHub.disapproveOperatorPerps#40:9 | 🎯💥🟢🌀 | perpManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OperatorPanel.onlySenderOrOperatorHub#73:13 | 🎯🌈🟢 | msg.sender != account && msg.sender != operatorHub

External Calls

OperatorHub.getRoleApprovalsSpot | 🎯💥🟢🟩🌀 | return accountManager.getOperatorRoleApprovals(account, operator)
OperatorHub.getRoleApprovalsPerps | 🎯💥🟢🟩🌀 | return perpManager.getOperatorRoleApprovals(account, operator)
OperatorHub.approveOperatorSpot | 🎯💥🟢🌀 | accountManager.approveOperator(msg.sender, operator, roles)
OperatorHub.approveOperatorPerps | 🎯💥🟢🌀 | perpManager.approveOperator(msg.sender, operator, roles)
OperatorHub.disapproveOperatorSpot | 🎯💥🟢🌀 | accountManager.disapproveOperator(msg.sender, operator, roles)
OperatorHub.disapproveOperatorPerps | 🎯💥🟢🌀 | perpManager.disapproveOperator(msg.sender, operator, roles)


modifiers_html

functions_html

OperatorStorageLib,/home/ubuntu/2025-08-gte-perps/contracts/utils/OperatorPanel.sol#35:1

state_vars_html

(storage) OperatorStorageLib.getOperatorStorage().self |

Solidity Vars Used

this
this @ 🔗 GTL.disapproveOperator#178:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).disapproveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})
this @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 Launchpad.sell#359:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amountInBase)
this @ 🔗 GTL.approveOperator#170:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).approveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})
this @ 🔗 AccountManager.deposit#186:9 | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amount)

msg.sender
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 OperatorHub.approveOperatorSpot#28:9 | 🎯💥🟢🌀 | accountManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 OperatorHub.approveOperatorPerps#32:9 | 🎯💥🟢🌀 | perpManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 GTERouter.spotDeposit#125:13 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.spotDeposit#127:13 | 🎯💥🟢🌀 | acctManager.deposit(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 OperatorHub.disapproveOperatorSpot#36:9 | 🎯💥🟢🌀 | accountManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.launchpadSell#188:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.sell({account:msg.sender,token:launchToken,recipient:msg.sender,amountInBase:amountInBase,minAmountOutQuote:worstAmountOutQuote})
msg.sender @ 🔗 OperatorHub.disapproveOperatorPerps#40:9 | 🎯💥🟢🌀 | perpManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#22:13 | 🎯🟩🌀 | msg.sender == account || msg.sender == gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#24:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 Launchpad.onlySenderOrOperator#144:13 | 🎯🌈🟢 | msg.sender != gteRouter
msg.sender @ 🔗 GTERouter.spotWithdraw#153:9 | 🎯💥🟢🌀 | acctManager.withdraw(msg.sender,token,amount)
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#33:13 | 🎯🟩🌀 | msg.sender == account
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#35:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)

modifiers_html

functions_html

OperatorPanel,/home/ubuntu/2025-08-gte-perps/contracts/utils/OperatorPanel.sol#51:1

state_vars_html

(storage) OperatorPanel._getOperatorStorage().self |
(storage) OperatorPanel.approveOperator(address,address,uint256).self | _getOperatorStorage()
(i) (w) 🔗 OperatorPanel.approveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L92 | self.operatorRoleApprovals[account][operator] = approvedRoles | roles
(i) (r) 🔗 OperatorPanel.approveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L91 | approvedRoles = self.operatorRoleApprovals[account][operator]

(storage) OperatorPanel.disapproveOperator(address,address,uint256).self | _getOperatorStorage()
(i) (w) 🔗 OperatorPanel.disapproveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L104 | self.operatorRoleApprovals[account][operator] = approvedRoles & (~ roles)
(i) (r) 🔗 OperatorPanel.disapproveOperator | 🎯💥❌ ['onlySenderOrOperatorHub(address)']#L103 | approvedRoles = self.operatorRoleApprovals[account][operator]

Solidity Vars Used

this
this @ 🔗 GTL.disapproveOperator#178:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).disapproveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 Launchpad.sell#359:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amountInBase)
this @ 🔗 GTL.approveOperator#170:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).approveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})

msg.sender
msg.sender @ 🔗 OperatorHub.approveOperatorSpot#28:9 | 🎯💥🟢🌀 | accountManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OperatorHub.approveOperatorPerps#32:9 | 🎯💥🟢🌀 | perpManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 OperatorHub.disapproveOperatorSpot#36:9 | 🎯💥🟢🌀 | accountManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.launchpadSell#188:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.sell({account:msg.sender,token:launchToken,recipient:msg.sender,amountInBase:amountInBase,minAmountOutQuote:worstAmountOutQuote})
msg.sender @ 🔗 OperatorHub.disapproveOperatorPerps#40:9 | 🎯💥🟢🌀 | perpManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 OperatorPanel.onlySenderOrOperatorHub#73:13 | 🎯🌈🟢 | msg.sender != account && msg.sender != operatorHub
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#22:13 | 🎯🟩🌀 | msg.sender == account || msg.sender == gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#24:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 Launchpad.onlySenderOrOperator#144:13 | 🎯🌈🟢 | msg.sender != gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#33:13 | 🎯🟩🌀 | msg.sender == account
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#35:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)

modifiers_html

functions_html

EventNonceLib,/home/ubuntu/2025-08-gte-perps/contracts/utils/types/EventNonce.sol#14:1

state_vars_html

(storage) EventNonceLib.getEventNonceStorage().ds |
(storage) EventNonceLib.inc().ds | getEventNonceStorage()
(i) (w) 🔗 EventNonceLib.inc | 🎯#L31 | ds = getEventNonceStorage()
(i) (w) 🔗 EventNonceLib.inc | 🎯#L32 | ++ ds.eventNonce

(storage) EventNonceLib.getCurrentNonce().ds | getEventNonceStorage()
(i) (w) 🔗 EventNonceLib.getCurrentNonce | 🎯🟩#L38 | ds = getEventNonceStorage()

Solidity Vars Used

this
this @ 🔗 GTL.disapproveOperator#178:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).disapproveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})
this @ 🔗 AccountManager.depositTo#193:9 | 🎯💥 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 Launchpad.updateQuoteAsset#386:9 | 🎯💥🟢🔴🌀❌ ['onlyOwner'] | LaunchToken(newQuoteAsset).approve(address(this),0)
this @ 🔗 AccountManager.depositFromRouter#207:9 | 🎯💥🟢❌ ['onlyGTERouter'] | token.safeTransferFrom(gteRouter,address(this),amount)
this @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
this @ 🔗 Launchpad.initialize#185:9 | 🎯💥🟢🔴🌀 ['initializer'] | LaunchToken(quoteAsset_).approve(address(this),0)
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)
this @ 🔗 Launchpad.sell#359:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amountInBase)
this @ 🔗 GTL.approveOperator#170:9 | 🎯💥🟢🌀❌ ['onlyOwner'] | IOperatorPanel(perpManager).approveOperator({account:address(this),operator:operator,roles:1 << uint256(PerpsOperatorRoles.ADMIN)})
this @ 🔗 AccountManager.deposit#186:9 | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amount)

msg.sender
msg.sender @ 🔗 AccountManager.depositTo#193:9 | 🎯💥 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 CLOBManager.createMarket#217:9 | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | _emitMarketCreated(msg.sender,marketAddress,quoteDecimals,baseDecimals,config,settings)
msg.sender @ 🔗 AccountManager.withdrawToPerps#221:13 | 🎯💥🟢🌀 | msg.sender != address(perpManager)
msg.sender @ 🔗 OperatorHub.approveOperatorSpot#28:9 | 🎯💥🟢🌀 | accountManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 OperatorHub.approveOperatorPerps#32:9 | 🎯💥🟢🌀 | perpManager.approveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 GTERouter.spotDeposit#125:13 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.spotDeposit#127:13 | 🎯💥🟢🌀 | acctManager.deposit(msg.sender,token,amount)
msg.sender @ 🔗 OperatorHub.disapproveOperatorSpot#36:9 | 🎯💥🟢🌀 | accountManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#138:9 | 🎯💥🟢🌀 | permit2.permit(msg.sender,permitSingle,signature)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#141:9 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 OperatorHub.disapproveOperatorPerps#40:9 | 🎯💥🟢🌀 | perpManager.disapproveOperator(msg.sender,operator,roles)
msg.sender @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)
msg.sender @ 🔗 GTERouter.spotWithdraw#153:9 | 🎯💥🟢🌀 | acctManager.withdraw(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 GTERouter.launchpadSell#188:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.sell({account:msg.sender,token:launchToken,recipient:msg.sender,amountInBase:amountInBase,minAmountOutQuote:worstAmountOutQuote})
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#327:13 | 🎯🟢🌀 | acctManager.withdrawToRouter(msg.sender,route.nextTokenIn,route.prevAmountOut)
msg.sender @ 🔗 GTERouter._accountDepositInternal#355:9 | 🎯🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)

msg.value
msg.value @ 🔗 GTERouter.wrapSpotDeposit#146:9 | 🎯💥🟢🌀💲 | weth.deposit{value: msg.value}()
msg.value @ 🔗 GTERouter.wrapSpotDeposit#147:9 | 🎯💥🟢🌀💲 | address(weth).safeApprove(address(acctManager),msg.value)
msg.value @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)
msg.value @ 🔗 Launchpad.launch#244:13 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | msg.value != launchFee

block.timestamp
block.timestamp @ 🔗 Launchpad.launch#259:9 | 🎯💥🟢🔴🌀💲 ['nonReentrant'] | TokenLaunched({dev:msg.sender,token:token,quoteAsset:quote,bondingCurve:curve,timestamp:block.timestamp,eventNonce:EventNonceLib.inc()})
block.timestamp @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)

modifiers_html

functions_html

OperatorHelperLib,/home/ubuntu/2025-08-gte-perps/contracts/utils/types/OperatorHelperLib.sol#7:1

state_vars_html

(storage) OperatorHelperLib.onlySenderOrOperator(OperatorStorage,address,address,SpotOperatorRoles).self |
(i) (r) 🔗 OperatorHelperLib.onlySenderOrOperator | 🎯🟩#L48 | rolesPacked = self.operatorRoleApprovals[account][msg.sender]

(storage) OperatorHelperLib.onlySenderOrOperator(OperatorStorage,address,PerpsOperatorRoles).self |
(i) (r) 🔗 OperatorHelperLib.onlySenderOrOperator | 🎯🟩#L59 | rolesPacked = self.operatorRoleApprovals[account][msg.sender]

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#46:13 | 🎯🟩 | msg.sender == account || msg.sender == gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#48:9 | 🎯🟩 | rolesPacked = self.operatorRoleApprovals[account][msg.sender]
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#57:13 | 🎯🟩 | msg.sender == account
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#59:9 | 🎯🟩 | rolesPacked = self.operatorRoleApprovals[account][msg.sender]
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 GTERouter.spotDeposit#125:13 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.spotDeposit#127:13 | 🎯💥🟢🌀 | acctManager.deposit(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 GTERouter.launchpadSell#188:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.sell({account:msg.sender,token:launchToken,recipient:msg.sender,amountInBase:amountInBase,minAmountOutQuote:worstAmountOutQuote})
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#22:13 | 🎯🟩🌀 | msg.sender == account || msg.sender == gteRouter
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#24:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)
msg.sender @ 🔗 Launchpad.onlySenderOrOperator#144:13 | 🎯🌈🟢 | msg.sender != gteRouter
msg.sender @ 🔗 GTERouter.spotWithdraw#153:9 | 🎯💥🟢🌀 | acctManager.withdraw(msg.sender,token,amount)
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#33:13 | 🎯🟩🌀 | msg.sender == account
msg.sender @ 🔗 OperatorHelperLib.onlySenderOrOperator#35:9 | 🎯🟩🌀 | rolesPacked = operator.getOperatorRoleApprovals(account,msg.sender)

this
this @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 Launchpad.sell#359:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amountInBase)
this @ 🔗 AccountManager.deposit#186:9 | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amount)

External Calls

OperatorHelperLib.onlySenderOrOperator | 🎯🟩🌀 | uint256 rolesPacked = operator.getOperatorRoleApprovals(account, msg.sender)
OperatorHelperLib.onlySenderOrOperator | 🎯🟩🌀 | uint256 rolesPacked = operator.getOperatorRoleApprovals(account, msg.sender)


modifiers_html

functions_html

UniswapV2ERC20,/home/ubuntu/2025-08-gte-perps/lib/gte-univ2/src/core/UniswapV2ERC20.sol#6:1

state_vars_html

UniswapV2ERC20.totalSupply |
(i) (w) 🔗 UniswapV2ERC20._mint | 🟢🔴#L38 | totalSupply = totalSupply.add(value)
(i) (w) 🔗 UniswapV2ERC20._burn | 🟢🔴#L45 | totalSupply = totalSupply.sub(value)
(r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L171 | numerator = totalSupply.mul(rootK.sub(rootKLast))
(r) 🔗 GTELaunchpadV2Pair._mintFee | 🎯🟢🔴🌀#L173 | liquidity = numerator / denominator
(r) 🔗 GTELaunchpadV2Pair.mint | 🎯💥🟢🔴🌀 ['lock']#L196 | liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0,amount1.mul(_totalSupply) / _reserve1)
(r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L217 | amount0 = liquidity.mul(balance0) / _totalSupply
(r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L218 | amount1 = liquidity.mul(balance1) / _totalSupply
(i) (r) 🔗 UniswapV2ERC20._mint | 🟢🔴#L38 | totalSupply = totalSupply.add(value)

UniswapV2ERC20.balanceOf |
(i) (w) 🔗 UniswapV2ERC20._mint | 🟢🔴#L39 | balanceOf[to] = balanceOf[to].add(value)
(i) (w) 🔗 UniswapV2ERC20._burn | 🟢🔴#L44 | balanceOf[from] = balanceOf[from].sub(value)
(i) (w) 🔗 UniswapV2ERC20._transfer | 🟢🔴#L55 | balanceOf[from] = balanceOf[from].sub(value)
(i) (w) 🔗 UniswapV2ERC20._transfer | 🟢🔴#L56 | balanceOf[to] = balanceOf[to].add(value)
(r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L213 | liquidity = balanceOf[address(this)]
(r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L217 | amount0 = liquidity.mul(balance0) / _totalSupply
(r) 🔗 GTELaunchpadV2Pair.burn | 🎯💥🟢🔴🌀 ['lock']#L218 | amount1 = liquidity.mul(balance1) / _totalSupply
(i) (r) 🔗 UniswapV2ERC20._mint | 🟢🔴#L39 | balanceOf[to] = balanceOf[to].add(value)
(i) (r) 🔗 UniswapV2ERC20._transfer | 🟢🔴#L55 | balanceOf[from] = balanceOf[from].sub(value)
(i) (r) 🔗 UniswapV2ERC20._transfer | 🟢🔴#L56 | balanceOf[to] = balanceOf[to].add(value)

UniswapV2ERC20.allowance |
(i) (w) 🔗 UniswapV2ERC20._approve | 🔴#L50 | allowance[owner][spender] = value
(i) (w) 🔗 UniswapV2ERC20.transferFrom | 💥🟢🔴#L72 | allowance[from][msg.sender] = allowance[from][msg.sender].sub(value)
(i) (r) 🔗 UniswapV2ERC20.transferFrom | 💥🟢🔴#L71 | allowance[from][msg.sender] != type()(uint256).max
(i) (r) 🔗 UniswapV2ERC20.transferFrom | 💥🟢🔴#L72 | allowance[from][msg.sender] = allowance[from][msg.sender].sub(value)
    (🔀?allowance[from][msg.sender]?)  (w) 🔗 GTL.queueWithdrawal | 🎯💥🟢🔴#L107 | _queuedShares[msg.sender] += shares
    (🔀?allowance[from][msg.sender]?)  (w) 🔗 GTL.cancelWithdrawal | 🎯💥🟢🔴#L117 | _queuedShares[msg.sender] -= _queuedWithdrawal[id].shares

UniswapV2ERC20.DOMAIN_SEPARATOR |
(i) (w) 🔗 UniswapV2ERC20.constructor | 💥🟢🔴#L26 | DOMAIN_SEPARATOR = keccak256(bytes)(abi.encode(keccak256(bytes)(EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)),keccak256(bytes)(bytes(name)),keccak256(bytes)(bytes(1)),chainId,address(this)))
(i) (r) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L82 | digest = keccak256(bytes)(abi.encodePacked(,DOMAIN_SEPARATOR,keccak256(bytes)(abi.encode(PERMIT_TYPEHASH,owner,spender,value,nonces[owner] ++,deadline))))
(i) (r) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L89 | recoveredAddress = ecrecover(bytes32,uint8,bytes32,bytes32)(digest,v,r,s)
(i) (r) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L90 | require(bool,string)(recoveredAddress != address(0) && recoveredAddress == owner,UniswapV2: INVALID_SIGNATURE)

UniswapV2ERC20.nonces |
(i) (w) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L82 | digest = keccak256(bytes)(abi.encodePacked(,DOMAIN_SEPARATOR,keccak256(bytes)(abi.encode(PERMIT_TYPEHASH,owner,spender,value,nonces[owner] ++,deadline))))
(i) (r) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L89 | recoveredAddress = ecrecover(bytes32,uint8,bytes32,bytes32)(digest,v,r,s)
(i) (r) 🔗 UniswapV2ERC20.permit | 💥🟢🔴#L90 | require(bool,string)(recoveredAddress != address(0) && recoveredAddress == owner,UniswapV2: INVALID_SIGNATURE)

Solidity Vars Used

msg.sender
msg.sender @ 🔗 UniswapV2ERC20.transferFrom#71:13 | 💥🟢🔴 | allowance[from][msg.sender] != type()(uint256).max
msg.sender @ 🔗 UniswapV2ERC20.transferFrom#72:13 | 💥🟢🔴 | allowance[from][msg.sender] = allowance[from][msg.sender].sub(value)
msg.sender @ 🔗 UniswapV2ERC20.approve#61:9 | 💥 | _approve(msg.sender,spender,value)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)
msg.sender @ 🔗 UniswapV2ERC20.transfer#66:9 | 💥 | _transfer(msg.sender,to,value)

block.timestamp
block.timestamp @ 🔗 UniswapV2ERC20.permit#81:9 | 💥🟢🔴 | require(bool,string)(deadline >= block.timestamp,UniswapV2: EXPIRED)

this
this @ 🔗 UniswapV2ERC20.constructor#26:9 | 💥🟢🔴 | DOMAIN_SEPARATOR = keccak256(bytes)(abi.encode(keccak256(bytes)(EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)),keccak256(bytes)(bytes(name)),keccak256(bytes)(bytes(1)),chainId,address(this)))
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair._getLaunchpadFees#281:9 | 🎯🟢🟩🌀 | totalLpBal = this.totalSupply()
this @ 🔗 GTELaunchpadV2Pair._getLaunchpadFees#282:9 | 🎯🟢🟩🌀 | launchpadLpBal = this.balanceOf(launchpadLp) + MINIMUM_LIQUIDITY

modifiers_html

functions_html

IUniswapV2Callee,/home/ubuntu/2025-08-gte-perps/lib/gte-univ2/src/core/interfaces/IUniswapV2Callee.sol#3:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)

this
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))

modifiers_html

functions_html

Math,/home/ubuntu/2025-08-gte-perps/lib/gte-univ2/src/core/libraries/Math.sol#5:1

state_vars_html


Solidity Vars Used

this
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))

msg.sender
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)

modifiers_html

functions_html

SafeMath,/home/ubuntu/2025-08-gte-perps/lib/gte-univ2/src/core/libraries/SafeMath.sol#5:1

state_vars_html


Solidity Vars Used

this
this @ 🔗 GTELaunchpadV2Pair.skim#310:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))
this @ 🔗 GTELaunchpadV2Pair.skim#311:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 GTELaunchpadV2Pair._getLaunchpadFees#281:9 | 🎯🟢🟩🌀 | totalLpBal = this.totalSupply()
this @ 🔗 GTELaunchpadV2Pair._getLaunchpadFees#282:9 | 🎯🟢🟩🌀 | launchpadLpBal = this.balanceOf(launchpadLp) + MINIMUM_LIQUIDITY
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))

msg.sender
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)
msg.sender @ 🔗 UniswapV2ERC20.transferFrom#71:13 | 💥🟢🔴 | allowance[from][msg.sender] != type()(uint256).max
msg.sender @ 🔗 UniswapV2ERC20.transferFrom#72:13 | 💥🟢🔴 | allowance[from][msg.sender] = allowance[from][msg.sender].sub(value)
msg.sender @ 🔗 UniswapV2ERC20.transfer#66:9 | 💥 | _transfer(msg.sender,to,value)
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)

block.timestamp
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})

modifiers_html

functions_html

UQ112x112,/home/ubuntu/2025-08-gte-perps/lib/gte-univ2/src/core/libraries/UQ112x112.sol#8:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor

this
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.sync#316:9 | 🎯💥🟢🌀 ['lock'] | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))

block.timestamp
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())
block.timestamp @ 🔗 GTELaunchpadV2Pair._update#132:9 | 🎯🟢🔴 | blockTimestamp = uint32(block.timestamp % 2 ** 32)

modifiers_html

functions_html

IERC20Metadata,/home/ubuntu/2025-08-gte-perps/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol#11:1

state_vars_html


Solidity Vars Used

this
this @ 🔗 GTELaunchpadV2Pair.skim#310:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))
this @ 🔗 GTELaunchpadV2Pair.skim#311:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))
this @ 🔗 GTELaunchpadV2Pair.sync#316:9 | 🎯💥🟢🌀 ['lock'] | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))

msg.sender
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 CLOBManager.createMarket#217:9 | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | _emitMarketCreated(msg.sender,marketAddress,quoteDecimals,baseDecimals,config,settings)
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor

block.timestamp
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

modifiers_html

functions_html

ERC165Checker,/home/ubuntu/2025-08-gte-perps/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol#15:1

state_vars_html


Solidity Vars Used

this
this @ 🔗 Launchpad.initialize#185:9 | 🎯💥🟢🔴🌀 ['initializer'] | LaunchToken(quoteAsset_).approve(address(this),0)

modifiers_html

functions_html

IAllowanceTransfer,/home/ubuntu/2025-08-gte-perps/lib/permit2/src/interfaces/IAllowanceTransfer.sol#9:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter.spotDepositPermit2#138:9 | 🎯💥🟢🌀 | permit2.permit(msg.sender,permitSingle,signature)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#141:9 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)

this
this @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)

modifiers_html

functions_html

Ownable,/home/ubuntu/2025-08-gte-perps/lib/solady/src/auth/Ownable.sol#14:1

state_vars_html


Solidity Vars Used

block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()

msg.sender
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())

modifiers_html

functions_html

OwnableRoles,/home/ubuntu/2025-08-gte-perps/lib/solady/src/auth/OwnableRoles.sol#16:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 OwnableRoles._checkRoles#103:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 SimpleBondingCurve.onlyLaunchpadOwner#54:13 | 🎯🌈🟢🌀 | msg.sender != Ownable(launchpad).owner()
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#121:13 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 OwnableRoles._checkOwnerOrRoles#124:17 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles.renounceRoles#220:9 | 💥💲 | _removeRoles(msg.sender,roles)
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#143:13 | 🟢🟩 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 OwnableRoles._checkRolesOrOwner#149:17 | 🟢🟩 | ! caller()() == sload(uint256)(~ _ROLE_SLOT_SEED)
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#199:17 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.requestOwnershipHandover#202:17 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#213:13 | 💥🟢💲 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 Ownable.cancelOwnershipHandover#216:13 | 💥🟢💲 | log2(uint256,uint256,uint256,uint256)(0,0,_OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE,caller()())
msg.sender @ 🔗 Ownable._checkOwner#155:13 | 🟢🟩 | ! caller()() == sload(uint256)(_OWNER_SLOT)

block.timestamp
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()
block.timestamp @ 🔗 Ownable.requestOwnershipHandover#194:13 | 💥🟢💲 | expires = block.timestamp + _ownershipHandoverValidFor()

modifiers_html

functions_html

ERC20,/home/ubuntu/2025-08-gte-perps/lib/solady/src/tokens/ERC20.sol#21:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor

this
this @ 🔗 GTELaunchpadV2Pair.sync#316:9 | 🎯💥🟢🌀 ['lock'] | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 ERC20.permit#433:13 | 💥🟢 | mstore(uint256,uint256)(m_permit_asm_1 + 0x80,address()())
this @ 🔗 ERC20.DOMAIN_SEPARATOR#484:13 | 💱💥🟢🟩 | mstore(uint256,uint256)(m_DOMAIN_SEPARATOR_asm_0 + 0x80,address()())
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))

block.timestamp
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

modifiers_html

functions_html

ERC4626,/home/ubuntu/2025-08-gte-perps/lib/solady/src/tokens/ERC4626.sol#12:1

state_vars_html


Solidity Vars Used

this
this @ 🔗 Launchpad.updateQuoteAsset#386:9 | 🎯💥🟢🔴🌀❌ ['onlyOwner'] | LaunchToken(newQuoteAsset).approve(address(this),0)
this @ 🔗 ERC20.permit#433:13 | 💥🟢 | mstore(uint256,uint256)(m_permit_asm_1 + 0x80,address()())
this @ 🔗 ERC4626._deposit#456:9 | 🟢 | SafeTransferLib.safeTransferFrom(asset(),by,address(this),assets)
this @ 🔗 ERC20.DOMAIN_SEPARATOR#484:13 | 💱💥🟢🟩 | mstore(uint256,uint256)(m_DOMAIN_SEPARATOR_asm_0 + 0x80,address()())
this @ 🔗 ERC4626.totalAssets#153:9 | 💥🟩 | assets = SafeTransferLib.balanceOf(asset(),address(this))
this @ 🔗 GTELaunchpadV2Pair.skim#310:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token0,to,IERC20(_token0).balanceOf(address(this)).sub(reserve0 + accruedLaunchpadFee0))
this @ 🔗 GTELaunchpadV2Pair.skim#311:9 | 🎯💥🟢🌀 ['lock'] | _safeTransfer(_token1,to,IERC20(_token1).balanceOf(address(this)).sub(reserve1 + accruedLaunchpadFee1))
this @ 🔗 ERC20.permit#433:13 | 💥🟢 | mstore(uint256,uint256)(m_permit_asm_1 + 0x80,address()())
this @ 🔗 ERC20.DOMAIN_SEPARATOR#484:13 | 💱💥🟢🟩 | mstore(uint256,uint256)(m_DOMAIN_SEPARATOR_asm_0 + 0x80,address()())

msg.sender
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.withdraw#416:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)

block.timestamp
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})

modifiers_html

functions_html

WETH,/home/ubuntu/2025-08-gte-perps/lib/solady/src/tokens/WETH.sol#10:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 WETH.withdraw#43:9 | 💥 | _burn(msg.sender,amount)
msg.sender @ 🔗 WETH.withdraw#47:13 | 💥 | ! call(uint256,uint256,uint256,uint256,uint256,uint256,uint256)(gas()(),caller()(),amount,codesize()(),0x00,codesize()(),0x00)
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.approve#202:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.approve#206:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x00,0x20,_APPROVAL_EVENT_SIGNATURE,caller()(),mload(uint256)(0x2c) >> 96)
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)
msg.sender @ 🔗 WETH.deposit#38:9 | 💥💲 | _mint(msg.sender,msg.value)
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor

this
this @ 🔗 Launchpad.updateQuoteAsset#386:9 | 🎯💥🟢🔴🌀❌ ['onlyOwner'] | LaunchToken(newQuoteAsset).approve(address(this),0)
this @ 🔗 ERC20.DOMAIN_SEPARATOR#484:13 | 💱💥🟢🟩 | mstore(uint256,uint256)(m_DOMAIN_SEPARATOR_asm_0 + 0x80,address()())
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))
this @ 🔗 ERC20.DOMAIN_SEPARATOR#484:13 | 💱💥🟢🟩 | mstore(uint256,uint256)(m_DOMAIN_SEPARATOR_asm_0 + 0x80,address()())
this @ 🔗 ERC20.permit#433:13 | 💥🟢 | mstore(uint256,uint256)(m_permit_asm_1 + 0x80,address()())
this @ 🔗 ERC20.permit#433:13 | 💥🟢 | mstore(uint256,uint256)(m_permit_asm_1 + 0x80,address()())
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))

msg.value
msg.value @ 🔗 GTERouter.wrapSpotDeposit#146:9 | 🎯💥🟢🌀💲 | weth.deposit{value: msg.value}()
msg.value @ 🔗 GTERouter.wrapSpotDeposit#147:9 | 🎯💥🟢🌀💲 | address(weth).safeApprove(address(acctManager),msg.value)
msg.value @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)
msg.value @ 🔗 WETH.deposit#38:9 | 💥💲 | _mint(msg.sender,msg.value)

block.timestamp
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

modifiers_html

functions_html

DynamicArrayLib,/home/ubuntu/2025-08-gte-perps/lib/solady/src/utils/DynamicArrayLib.sol#6:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])

modifiers_html

functions_html

EnumerableSetLib,/home/ubuntu/2025-08-gte-perps/lib/solady/src/utils/EnumerableSetLib.sol#14:1

state_vars_html

(storage) EnumerableSetLib.length(EnumerableSetLib.AddressSet).set |
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L100 | rootPacked_length_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L101 | n_length_asm_0 = rootPacked_length_asm_0 << 160 >> 160
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L102 | result = n_length_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L103 | ! ! rootPacked_length_asm_0 >> 96 | n_length_asm_0
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L105 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L107 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L685 | mstore(uint256,uint256)(0x00,s)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L97 | rootSlot = _rootSlot(set)

(storage) EnumerableSetLib.length(EnumerableSetLib.Bytes32Set).set |
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.length(EnumerableSetLib.Uint256Set).set |
(i) (r*) 🔗 EnumerableSetLib.length | 🟩#L136 | result = length(_toBytes32Set(set))
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.length(EnumerableSetLib.Int256Set).set |
(i) (r*) 🔗 EnumerableSetLib.length | 🟩#L141 | result = length(_toBytes32Set(set))
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.length(EnumerableSetLib.Uint8Set).set |
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L148 | packed_length_asm_0 = sload(uint256)(set)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L149 | packed_length_asm_0 = packed_length_asm_0 ^ packed_length_asm_0 & 1 + ~ packed_length_asm_0

(storage) EnumerableSetLib.contains(EnumerableSetLib.AddressSet,address).set |
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L156 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L165 | rootPacked_contains_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L167 | ! rootPacked_contains_asm_0 << 160 >> 160
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L169 | rootPacked_contains_asm_0 >> 96 == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L170 | sload(uint256)(rootSlot + 1) >> 96 == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L171 | sload(uint256)(rootSlot + 2) >> 96 == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L175 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L685 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.contains(EnumerableSetLib.Bytes32Set,bytes32).set |
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L185 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L194 | ! sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L196 | sload(uint256)(rootSlot) == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L197 | sload(uint256)(rootSlot + 1) == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L198 | sload(uint256)(rootSlot + 2) == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L202 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.contains(EnumerableSetLib.Uint256Set,uint256).set |
(i) (r*) 🔗 EnumerableSetLib.contains | 🟩#L212 | result = contains(_toBytes32Set(set),bytes32(value))
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L185 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L194 | ! sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L196 | sload(uint256)(rootSlot) == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L197 | sload(uint256)(rootSlot + 1) == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L198 | sload(uint256)(rootSlot + 2) == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L202 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.contains(EnumerableSetLib.Int256Set,int256).set |
(i) (r*) 🔗 EnumerableSetLib.contains | 🟩#L217 | result = contains(_toBytes32Set(set),bytes32(uint256(value)))
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L185 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L194 | ! sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L196 | sload(uint256)(rootSlot) == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L197 | sload(uint256)(rootSlot + 1) == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L198 | sload(uint256)(rootSlot + 2) == value
(i) (r) 🔗 EnumerableSetLib.contains | 🟢🟩#L202 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.contains(EnumerableSetLib.Uint8Set,uint8).set |
(i) (r) 🔗 EnumerableSetLib.contains | 🟩#L224 | result = 1 & sload(uint256)(set) >> 0xff & value

(storage) EnumerableSetLib.add(EnumerableSetLib.AddressSet,address).set |
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L230 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L239 | rootPacked_add_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L240 | n_add_asm_0 = rootPacked_add_asm_0 << 160 >> 160
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L241 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L242 | ! n_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L243 | v0_add_asm_0 = rootPacked_add_asm_0 >> 96
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L244 | ! v0_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L245 | sstore(uint256,uint256)(rootSlot,value << 96)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L249 | v0_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L250 | v1_add_asm_0 = sload(uint256)(rootSlot + 1) >> 96
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L251 | ! v1_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L252 | sstore(uint256,uint256)(rootSlot + 1,value << 96)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L256 | v1_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L257 | v2_add_asm_0 = sload(uint256)(rootSlot + 2) >> 96
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L258 | ! v2_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L259 | sstore(uint256,uint256)(rootSlot + 2,value << 96)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L263 | v2_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L264 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L266 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L268 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L270 | rootPacked_add_asm_0 = rootPacked_add_asm_0 | 7
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L276 | n_add_asm_0 = n_add_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L278 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L279 | ! n_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L280 | sstore(uint256,uint256)(rootSlot,3 | value << 96)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L283 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value << 96)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L284 | sstore(uint256,uint256)(rootSlot,2 + rootPacked_add_asm_0)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L685 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.add(EnumerableSetLib.Bytes32Set,bytes32).set |
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.add(EnumerableSetLib.Uint256Set,uint256).set |
(i) (r*) 🔗 EnumerableSetLib.add | #L351 | result = add(_toBytes32Set(set),bytes32(value))
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.add(EnumerableSetLib.Int256Set,int256).set |
(i) (r*) 🔗 EnumerableSetLib.add | #L356 | result = add(_toBytes32Set(set),bytes32(uint256(value)))
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L294 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L302 | n_add_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L303 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L304 | ! n_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L305 | v0_add_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L306 | ! v0_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L307 | sstore(uint256,uint256)(rootSlot,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L311 | v0_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L312 | v1_add_asm_0 = sload(uint256)(rootSlot + 1)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L313 | ! v1_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L314 | sstore(uint256,uint256)(rootSlot + 1,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L318 | v1_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L319 | v2_add_asm_0 = sload(uint256)(rootSlot + 2)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L320 | ! v2_add_asm_0
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L321 | sstore(uint256,uint256)(rootSlot + 2,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L325 | v2_add_asm_0 == value
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L326 | mstore(uint256,uint256)(0x00,v0_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L328 | mstore(uint256,uint256)(0x00,v1_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L330 | mstore(uint256,uint256)(0x00,v2_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L337 | n_add_asm_0 = n_add_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L338 | sstore(uint256,uint256)(rootSlot + n_add_asm_0,value)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L339 | sstore(uint256,uint256)(p_add_asm_0,1 + n_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | 🟢#L340 | sstore(uint256,uint256)(~ rootSlot,1 | 1 + n_add_asm_0 << 1)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.add(EnumerableSetLib.Uint8Set,uint8).set |
(i) (r) 🔗 EnumerableSetLib.add | #L363 | result = sload(uint256)(set)
(i) (r) 🔗 EnumerableSetLib.add | #L365 | sstore(uint256,uint256)(set,result | mask_add_asm_0)
(i) (r) 🔗 EnumerableSetLib.add | #L366 | result = ! result & mask_add_asm_0

(storage) EnumerableSetLib.remove(EnumerableSetLib.AddressSet,address).set |
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L372 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L381 | rootPacked_remove_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L382 | n_remove_asm_0 = rootPacked_remove_asm_0 << 160 >> 160
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L383 | ! n_remove_asm_0
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L385 | rootPacked_remove_asm_0 >> 96 == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L386 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L387 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L388 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L391 | sload(uint256)(rootSlot + 1) >> 96 == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L392 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L393 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L396 | sload(uint256)(rootSlot + 2) >> 96 == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L397 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L403 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L408 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L409 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L410 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0) >> 96
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L411 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0 << 96)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L412 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L413 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L416 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot) >> 96 << 96 | n_remove_asm_0 << 1 | 1)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L685 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.remove(EnumerableSetLib.Bytes32Set,bytes32).set |
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.remove(EnumerableSetLib.Uint256Set,uint256).set |
(i) (r*) 🔗 EnumerableSetLib.remove | #L478 | result = remove(_toBytes32Set(set),bytes32(value))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.remove(EnumerableSetLib.Int256Set,int256).set |
(i) (r*) 🔗 EnumerableSetLib.remove | #L483 | result = remove(_toBytes32Set(set),bytes32(uint256(value)))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L426 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L434 | n_remove_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L435 | ! n_remove_asm_0
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L437 | sload(uint256)(rootSlot) == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L438 | sstore(uint256,uint256)(rootSlot,sload(uint256)(rootSlot + 1))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L439 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L440 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L443 | sload(uint256)(rootSlot + 1) == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L444 | sstore(uint256,uint256)(rootSlot + 1,sload(uint256)(rootSlot + 2))
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L445 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L448 | sload(uint256)(rootSlot + 2) == value
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L449 | sstore(uint256,uint256)(rootSlot + 2,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L455 | mstore(uint256,uint256)(0x20,rootSlot)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L460 | n_remove_asm_0 = n_remove_asm_0 >> 1 - 1
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L461 | ! position_remove_asm_0 - 1 == n_remove_asm_0
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L462 | lastValue_remove_asm_0 = sload(uint256)(rootSlot + n_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L463 | sstore(uint256,uint256)(rootSlot + position_remove_asm_0 - 1,lastValue_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L464 | sstore(uint256,uint256)(rootSlot + n_remove_asm_0,0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L465 | mstore(uint256,uint256)(0x00,lastValue_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | 🟢#L468 | sstore(uint256,uint256)(~ rootSlot,n_remove_asm_0 << 1 | 1)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.remove(EnumerableSetLib.Uint8Set,uint8).set |
(i) (r) 🔗 EnumerableSetLib.remove | #L490 | result = sload(uint256)(set)
(i) (r) 🔗 EnumerableSetLib.remove | #L492 | sstore(uint256,uint256)(set,result & ~ mask_remove_asm_0)
(i) (r) 🔗 EnumerableSetLib.remove | #L493 | result = ! ! result & mask_remove_asm_0

(storage) EnumerableSetLib.values(EnumerableSetLib.AddressSet).set |
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L500 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L504 | rootPacked_values_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L505 | n_values_asm_0 = rootPacked_values_asm_0 << 160 >> 160
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L508 | v_values_asm_0 = rootPacked_values_asm_0 >> 96
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L509 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L511 | ! n_values_asm_0
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L514 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0) >> 96
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L517 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L518 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0) >> 96
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L521 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L527 | n_values_asm_0 = n_values_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L528 | i_values_asm_0 < n_values_asm_0
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L529 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0) >> 96
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L530 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L534 | mstore(uint256,uint256)(result,n_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L535 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L685 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.values(EnumerableSetLib.Bytes32Set).set |
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L550 | ! n_values_asm_0
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.values(EnumerableSetLib.Uint256Set).set |
(i) (r*) 🔗 EnumerableSetLib.values | 🟩#L583 | result = _toUints(values(_toBytes32Set(set)))
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L550 | ! n_values_asm_0
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.values(EnumerableSetLib.Int256Set).set |
(i) (r*) 🔗 EnumerableSetLib.values | 🟩#L589 | result = _toInts(values(_toBytes32Set(set)))
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L542 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L546 | n_values_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L550 | ! n_values_asm_0
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L551 | v_values_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L554 | mstore(uint256,uint256)(o_values_asm_0,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L555 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L558 | mstore(uint256,uint256)(o_values_asm_0 + 0x20,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L559 | v_values_asm_0 = sload(uint256)(rootSlot + n_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L562 | mstore(uint256,uint256)(o_values_asm_0 + 0x40,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L568 | n_values_asm_0 = n_values_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L569 | i_values_asm_0 < n_values_asm_0
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L570 | v_values_asm_0 = sload(uint256)(rootSlot + i_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L571 | mstore(uint256,uint256)(o_values_asm_0 + i_values_asm_0 << 5,v_values_asm_0 * ! v_values_asm_0 == zs_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L575 | mstore(uint256,uint256)(result,n_values_asm_0)
(i) (r) 🔗 EnumerableSetLib.values | 🟢🟩#L576 | mstore(uint256,uint256)(0x40,o_values_asm_0 + n_values_asm_0 << 5)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.values(EnumerableSetLib.Uint8Set).set |
(i) (r) 🔗 EnumerableSetLib.values | 🟩#L599 | packed_values_asm_0 = sload(uint256)(set)
(i) (r) 🔗 EnumerableSetLib.values | 🟩#L600 | ! packed_values_asm_0 & 0xffff
(i) (r) 🔗 EnumerableSetLib.values | 🟩#L602 | packed_values_asm_0 = packed_values_asm_0 >> 16
(i) (r) 🔗 EnumerableSetLib.values | 🟩#L606 | ptr_values_asm_0 = ptr_values_asm_0 + packed_values_asm_0 & 1 << 5
(i) (r) 🔗 EnumerableSetLib.values | 🟩#L608 | packed_values_asm_0 = packed_values_asm_0 >> 1

(storage) EnumerableSetLib.at(EnumerableSetLib.AddressSet,uint256).set |
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L100 | rootPacked_length_asm_0 = sload(uint256)(rootSlot)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L101 | n_length_asm_0 = rootPacked_length_asm_0 << 160 >> 160
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L102 | result = n_length_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L103 | ! ! rootPacked_length_asm_0 >> 96 | n_length_asm_0
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L105 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L107 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L617 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L620 | result = sload(uint256)(rootSlot + i) >> 96
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L621 | result = result * ! result == _ZERO_SENTINEL
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L623 | i >= length(set)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L685 | mstore(uint256,uint256)(0x00,s)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L97 | rootSlot = _rootSlot(set)

(storage) EnumerableSetLib.at(EnumerableSetLib.Bytes32Set,uint256).set |
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L628 | result = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L631 | result = sload(uint256)(result + i)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L632 | result = result * ! result == _ZERO_SENTINEL
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L634 | i >= length(set)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.at(EnumerableSetLib.Uint256Set,uint256).set |
(i) (r*) 🔗 EnumerableSetLib.at | 🟩#L639 | result = uint256(at(_toBytes32Set(set),i))
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L628 | result = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L631 | result = sload(uint256)(result + i)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L632 | result = result * ! result == _ZERO_SENTINEL
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L634 | i >= length(set)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.at(EnumerableSetLib.Int256Set,uint256).set |
(i) (r*) 🔗 EnumerableSetLib.at | 🟩#L644 | result = int256(uint256(at(_toBytes32Set(set),i)))
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L116 | rootSlot = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L119 | n_length_asm_0 = sload(uint256)(~ rootSlot)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L120 | result = n_length_asm_0 >> 1
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L121 | ! n_length_asm_0
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L123 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L125 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.length | 🟩#L127 | ! sload(uint256)(rootSlot + result)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L628 | result = _rootSlot(set)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L631 | result = sload(uint256)(result + i)
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L632 | result = result * ! result == _ZERO_SENTINEL
(i) (r) 🔗 EnumerableSetLib.at | 🟢🟩#L634 | i >= length(set)
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib.at(EnumerableSetLib.Uint8Set,uint256).set |
(i) (r) 🔗 EnumerableSetLib.at | 🟩#L651 | packed_at_asm_0 = sload(uint256)(set)
(i) (r) 🔗 EnumerableSetLib.at | 🟩#L658 | packed_at_asm_0 = packed_at_asm_0 ^ packed_at_asm_0 & 1 + ~ packed_at_asm_0
(i) (r) 🔗 EnumerableSetLib.at | 🟩#L661 | ! packed_at_asm_0
(i) (r) 🔗 EnumerableSetLib.at | 🟩#L665 | x_at_asm_0 = packed_at_asm_0 & 1 + ~ packed_at_asm_0
(i) (r) 🔗 EnumerableSetLib.at | 🟩#L666 | r_at_asm_0 = ! ! x_at_asm_0 >> 128 << 7
(i) (r) 🔗 EnumerableSetLib.at | 🟩#L667 | r_at_asm_0 = r_at_asm_0 | ! ! x_at_asm_0 >> r_at_asm_0 >> 64 << 6
(i) (r) 🔗 EnumerableSetLib.at | 🟩#L668 | r_at_asm_0 = r_at_asm_0 | 0xffffffff < x_at_asm_0 >> r_at_asm_0 << 5
(i) (r) 🔗 EnumerableSetLib.at | 🟩#L671 | result = r_at_asm_0 | byte(uint256,uint256)(0xd76453e0 / x_at_asm_0 >> r_at_asm_0 & 0x1f,0x001f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405)

(storage) EnumerableSetLib._rootSlot(EnumerableSetLib.AddressSet).s |
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L685 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib._rootSlot(EnumerableSetLib.Bytes32Set).s |
(i) (r) 🔗 EnumerableSetLib._rootSlot | 🟢🟩#L695 | mstore(uint256,uint256)(0x00,s)

(storage) EnumerableSetLib._toBytes32Set(EnumerableSetLib.Uint256Set).s |
(storage) EnumerableSetLib._toBytes32Set(EnumerableSetLib.Uint256Set).c |
(storage) EnumerableSetLib._toBytes32Set(EnumerableSetLib.Int256Set).s |
(storage) EnumerableSetLib._toBytes32Set(EnumerableSetLib.Int256Set).c |

Solidity Vars Used

msg.sender
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])
this @ 🔗 GTL.orderbookCollateral#219:13 | 🎯💥🟢🟩🌀 | collateral += IViewPort(perpManager).getOrderbookCollateral(address(this),subaccounts[i])

modifiers_html

functions_html

FixedPointMathLib,/home/ubuntu/2025-08-gte-perps/lib/solady/src/utils/FixedPointMathLib.sol#7:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 CLOBManager.createMarket#217:9 | 🎯💥🟢🌀❌ ['onlyOwnerOrRoles(uint256)'] | _emitMarketCreated(msg.sender,marketAddress,quoteDecimals,baseDecimals,config,settings)
msg.sender @ 🔗 ERC4626.withdraw#416:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])
this @ 🔗 GTL.orderbookCollateral#219:13 | 🎯💥🟢🟩🌀 | collateral += IViewPort(perpManager).getOrderbookCollateral(address(this),subaccounts[i])
this @ 🔗 GTL._convertToAssets#293:9 | 🎯💥🟢🟩 | shares.fullMulDiv(usdc.balanceOf(address(this)) + allocatedAssets + 1,totalSupply() + 1)

block.timestamp
block.timestamp @ 🔗 MarketLib.getFundingRateComponent#456:9 | 🎯🟩 | indexPrice.fullMulDiv(1e18 + fundingRateEngine.fundingRate.abs().fullMulDiv(block.timestamp - fundingRateEngine.lastFundingTime,fundingRateEngine.getFundingInterval(asset)),1e18)
block.timestamp @ 🔗 FundingLib.settleFunding#51:9 | 🎯 | self.lastFundingTime = block.timestamp

modifiers_html

functions_html

RedBlackTreeLib,/home/ubuntu/2025-08-gte-perps/lib/solady/src/utils/RedBlackTreeLib.sol#9:1

state_vars_html

(storage) RedBlackTreeLib.size(RedBlackTreeLib.Tree).tree |
(i) (r) 🔗 RedBlackTreeLib.size | 🟢🟩#L100 | nodes = _nodes(tree)
(i) (r) 🔗 RedBlackTreeLib.size | 🟢🟩#L103 | result = sload(uint256)(nodes) & _BITMASK_KEY
(i) (r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.values(RedBlackTreeLib.Tree).tree |
(i) (r) 🔗 RedBlackTreeLib.values | 🟢🟩#L111 | nodes = _nodes(tree)
(i) (r) 🔗 RedBlackTreeLib.values | 🟢🟩#L126 | rootPacked_values_asm_0 = sload(uint256)(nodes)
(i) (r) 🔗 RedBlackTreeLib.values | 🟢🟩#L127 | mstore(uint256,uint256)(result,rootPacked_values_asm_0 & _BITMASK_KEY)
(i) (r) 🔗 RedBlackTreeLib.values | 🟢🟩#L128 | mstore(uint256,uint256)(0x00,nodes)
(i) (r) 🔗 RedBlackTreeLib.values | 🟢🟩#L131 | visit(rootPacked_values_asm_0 >> 128)
(i) (r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.find(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib.find | 🟩#L138 | (nodes,None,key) = _find(tree,x)
(i) (r) 🔗 RedBlackTreeLib.find | 🟩#L139 | result = _pack(nodes,key)
(i) (r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.nearest(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L146 | (nodes,cursor,key) = _find(tree,x)
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L148 | cursor == uint256(0)
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L149 | key != uint256(0)
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L150 | a = _pack(nodes,cursor)
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L151 | aValue = value(a)
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L152 | b = next(a)
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L153 | b == bytes32(0)
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L154 | bValue = value(b)
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L155 | aDist = x - aValue
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L156 | bDist = x - bValue
(i) (r) 🔗 RedBlackTreeLib.nearest | 🟩#L157 | (aValue < bValue)
(i) (r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.nearestBefore(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L164 | (nodes,cursor,key) = _find(tree,x)
(i) (r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L165 | cursor == uint256(0)
(i) (r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L166 | key != uint256(0)
(i) (r) 🔗 RedBlackTreeLib.nearestBefore | 🟩#L167 | a = _pack(nodes,cursor)
(i) (r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.nearestAfter(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L174 | (nodes,cursor,key) = _find(tree,x)
(i) (r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L175 | cursor == uint256(0)
(i) (r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L176 | key != uint256(0)
(i) (r) 🔗 RedBlackTreeLib.nearestAfter | 🟩#L177 | a = _pack(nodes,cursor)
(i) (r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.exists(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib.exists | 🟩#L183 | (None,None,key) = _find(tree,x)
(i) (r) 🔗 RedBlackTreeLib.exists | 🟩#L184 | result = key != 0
(i) (r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.insert(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib.insert | #L190 | err = tryInsert(tree,x)
(i) (r) 🔗 RedBlackTreeLib.insert | #L191 | err != 0
(i) (r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(i) (r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(i) (r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.tryInsert(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib.tryInsert | #L198 | (nodes,cursor,key) = _find(tree,x)
(i) (r) 🔗 RedBlackTreeLib.tryInsert | #L199 | err = _update(nodes,cursor,key,x,0)
(i) (r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.remove(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib.remove | #L205 | err = tryRemove(tree,x)
(i) (r) 🔗 RedBlackTreeLib.remove | #L206 | err != 0
(i) (r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(i) (r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(i) (r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.tryRemove(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib.tryRemove | #L213 | (nodes,None,key) = _find(tree,x)
(i) (r) 🔗 RedBlackTreeLib.tryRemove | #L214 | err = _update(nodes,0,key,0,1)
(i) (r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.first(RedBlackTreeLib.Tree).tree |
(i) (r) 🔗 RedBlackTreeLib.first | 🟢🟩#L249 | result = _end(tree,_BITPOS_LEFT)
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(i) (r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib.last(RedBlackTreeLib.Tree).tree |
(i) (r) 🔗 RedBlackTreeLib.last | 🟢🟩#L255 | result = _end(tree,_BITPOS_RIGHT)
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(i) (r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib._end(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L300 | nodes = _nodes(tree)
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L303 | result = sload(uint256)(nodes) >> 128
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L306 | packed__end_asm_0 = sload(uint256)(nodes | result)
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L307 | left__end_asm_0 = packed__end_asm_0 >> L & _BITMASK_KEY
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L308 | ! left__end_asm_0
(i) (r) 🔗 RedBlackTreeLib._end | 🟢🟩#L313 | result = _pack(nodes,uint256(result))
(i) (r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib._nodes(RedBlackTreeLib.Tree).tree |
(i) (r) 🔗 RedBlackTreeLib._nodes | 🟢🟩#L673 | mstore(uint256,uint256)(0x20,tree)

(storage) RedBlackTreeLib._find(RedBlackTreeLib.Tree,uint256).tree |
(i) (r) 🔗 RedBlackTreeLib._find | 🟢🟩#L688 | mstore(uint256,uint256)(0x20,tree)

Solidity Vars Used

msg.sender
msg.sender @ 🔗 GTERouter.clobCancel#162:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.cancel(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 GTERouter.clobPlaceOrder#179:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.placeOrder(msg.sender,args)
msg.sender @ 🔗 CLOB._executeBid#526:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 GTERouter._executeClobPostFillOrder#307:9 | 🎯🟢🌀 | result = ICLOB(market).placeOrder(msg.sender,fillArgs)
msg.sender @ 🔗 CLOB._executeAsk#567:9 | 🎯🟢 | ds.incrementLimitsPlaced(address(factory),msg.sender)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

modifiers_html

functions_html

SafeCastLib,/home/ubuntu/2025-08-gte-perps/lib/solady/src/utils/SafeCastLib.sol#8:1

state_vars_html


Solidity Vars Used

this
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 GTL.totalAccountValue#210:13 | 🎯💥🟢🟩🌀 | subaccountValue = IViewPort(perpManager).getAccountValue(address(this),subaccounts[i])

block.timestamp
block.timestamp @ 🔗 FundingLib.settleFunding#51:9 | 🎯 | self.lastFundingTime = block.timestamp

msg.sender
msg.sender @ 🔗 GTERouter.clobAmend#171:9 | 🎯💥🌀 ['isMarket(ICLOB)'] | clob.amend(msg.sender,args)
msg.sender @ 🔗 CLOBLib._executeBuyOrder#243:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)
msg.sender @ 🔗 CLOBLib._executeSellOrder#288:9 | 🎯 | ds.incrementLimitsPlaced(msg.sender)

modifiers_html

functions_html

SafeTransferLib,/home/ubuntu/2025-08-gte-perps/lib/solady/src/utils/SafeTransferLib.sol#11:1

state_vars_html


Solidity Vars Used

msg.sender
msg.sender @ 🔗 AccountManager.depositTo#193:9 | 🎯💥 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 Distributor.claimRewards#162:9 | 🎯💥 | (baseAmount,quoteAmount) = rs.claim(msg.sender)
msg.sender @ 🔗 Distributor._distributeAssets#170:13 | 🎯 | base.safeTransfer(msg.sender,baseAmount)
msg.sender @ 🔗 Distributor._distributeAssets#175:13 | 🎯 | quote.safeTransfer(msg.sender,quoteAmount)
msg.sender @ 🔗 AccountManager.withdrawToPerps#221:13 | 🎯💥🟢🌀 | msg.sender != address(perpManager)
msg.sender @ 🔗 PerpManager.depositTo#112:9 | 🎯💥 | StorageLib.loadCollateralManager().depositFreeCollateral({from:msg.sender,to:account,amount:amount})
msg.sender @ 🔗 Launchpad.increaseStake#423:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.increaseStake(msg.sender,account,shares)
msg.sender @ 🔗 Launchpad.decreaseStake#427:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | distributor.decreaseStake(msg.sender,account,shares)
msg.sender @ 🔗 PerpManager.withdrawToSpot#128:13 | 🎯💥🟢 | msg.sender != address(accountManager)
msg.sender @ 🔗 Launchpad.endRewards#434:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | quote = _launches[msg.sender].quote
msg.sender @ 🔗 Launchpad.endRewards#436:9 | 🎯💥🟢🌀❌ ['onlyLaunchAsset'] | pair = IGTELaunchpadV2Pair(address(pairFor(address(uniV2Factory),msg.sender,quote)))
msg.sender @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
msg.sender @ 🔗 GTERouter.spotDeposit#125:13 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 GTERouter.spotDeposit#127:13 | 🎯💥🟢🌀 | acctManager.deposit(msg.sender,token,amount)
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#138:9 | 🎯💥🟢🌀 | permit2.permit(msg.sender,permitSingle,signature)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
msg.sender @ 🔗 GTERouter.spotDepositPermit2#141:9 | 🎯💥🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)
msg.sender @ 🔗 Launchpad._swapRemaining#538:9 | 🎯🟢🌀 | data.quote.safeTransferFrom(msg.sender,address(this),data.quoteAmount)
msg.sender @ 🔗 Launchpad._swapRemaining#556:13 | 🎯🟢🌀 | data.quote.safeTransfer(msg.sender,data.quoteAmount)
msg.sender @ 🔗 ERC4626.withdraw#416:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 GTERouter.spotWithdraw#153:9 | 🎯💥🟢🌀 | acctManager.withdraw(msg.sender,token,amount)
msg.sender @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#98:13 | 🎯💥🟢🔴🌀 | msg.sender != launchpadFeeDistributor
msg.sender @ 🔗 ERC4626.redeem#436:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 ERC20.transfer#218:9 | 💥🟢 | _beforeTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 ERC20.transfer#223:13 | 💥🟢 | mstore(uint256,uint256)(0x00,caller()())
msg.sender @ 🔗 ERC20.transfer#242:13 | 💥🟢 | log3(uint256,uint256,uint256,uint256,uint256)(0x20,0x20,_TRANSFER_EVENT_SIGNATURE,caller()(),mload(uint256)(0x0c) >> 96)
msg.sender @ 🔗 ERC20.transfer#244:9 | 💥🟢 | _afterTokenTransfer(msg.sender,to,amount)
msg.sender @ 🔗 GTELaunchpadV2Pair.mint#203:9 | 🎯💥🟢🔴🌀 ['lock'] | Mint(msg.sender,amount0,amount1)
msg.sender @ 🔗 GTERouter.launchpadSell#188:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.sell({account:msg.sender,token:launchToken,recipient:msg.sender,amountInBase:amountInBase,minAmountOutQuote:worstAmountOutQuote})
msg.sender @ 🔗 ERC4626.deposit#379:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 GTELaunchpadV2Pair.burn#228:9 | 🎯💥🟢🔴🌀 ['lock'] | Burn(msg.sender,amount0,amount1,to)
msg.sender @ 🔗 Distributor.skimExcessRewards#53:9 | 🎯💥🟢❌ ['onlyOwnerOrRoles(uint256)'] | asset.safeTransfer(msg.sender,amount)
msg.sender @ 🔗 GTERouter.launchpadBuy#203:9 | 🎯💥🟢🌀 ['nonReentrant'] | launchpad.buy(ILaunchpad.BuyData({account:msg.sender,token:launchToken,recipient:msg.sender,amountOutBase:amountOutBase,maxAmountInQuote:worstAmountInQuote}))
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#246:34 | 🎯💥🟢🌀 ['lock'] | IUniswapV2Callee(to).uniswapV2Call(msg.sender,amount0Out,amount1Out,data)
msg.sender @ 🔗 GTELaunchpadV2Pair.swap#269:9 | 🎯💥🟢🌀 ['lock'] | Swap(msg.sender,amount0In,amount1In,amount0Out,amount1Out,to)
msg.sender @ 🔗 ERC20.transferFrom#264:17 | 💥🟢 | ! caller()() == _PERMIT2
msg.sender @ 🔗 ERC20.transferFrom#266:21 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC20.transferFrom#308:17 | 💥🟢 | mstore(uint256,uint256)(0x20,caller()())
msg.sender @ 🔗 ERC4626.mint#396:9 | 💥 | _deposit(msg.sender,to,assets,shares)
msg.sender @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#327:13 | 🎯🟢🌀 | acctManager.withdrawToRouter(msg.sender,route.nextTokenIn,route.prevAmountOut)
msg.sender @ 🔗 ERC4626.withdraw#416:9 | 💥 | _withdraw(msg.sender,to,owner,assets,shares)
msg.sender @ 🔗 GTERouter._accountDepositInternal#355:9 | 🎯🟢🌀 | acctManager.depositFromRouter(msg.sender,token,amount)
msg.sender @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
msg.sender @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))

this
this @ 🔗 AccountManager.depositTo#193:9 | 🎯💥 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 AccountManager.depositFromRouter#207:9 | 🎯💥🟢❌ ['onlyGTERouter'] | token.safeTransferFrom(gteRouter,address(this),amount)
this @ 🔗 GTL.totalAssets#202:9 | 🎯💥🟢🟩 | usdc.balanceOf(address(this)) + orderbookCollateral() + freeCollateralBalance() + totalAccountValue()
this @ 🔗 ERC4626._deposit#456:9 | 🟢 | SafeTransferLib.safeTransferFrom(asset(),by,address(this),assets)
this @ 🔗 ERC4626.totalAssets#153:9 | 💥🟩 | assets = SafeTransferLib.balanceOf(asset(),address(this))
this @ 🔗 GTERouter.spotDeposit#123:13 | 🎯💥🟢🌀 | token.safeTransferFrom(msg.sender,address(this),amount)
this @ 🔗 GTERouter.spotDepositPermit2#139:9 | 🎯💥🟢🌀 | permit2.transferFrom(msg.sender,address(this),amount,token)
this @ 🔗 CollateralManagerLib.depositFreeCollateral#36:9 | 🎯🟢 | USDC.safeTransferFrom(from,address(this),amount)
this @ 🔗 Launchpad._swapRemaining#538:9 | 🎯🟢🌀 | data.quote.safeTransferFrom(msg.sender,address(this),data.quoteAmount)
this @ 🔗 SafeTransferLib.safeTransferAllETH#99:13 | | ! call(uint256,uint256,uint256,uint256,uint256,uint256,uint256)(gas()(),to,selfbalance()(),codesize()(),0x00,codesize()(),0x00)
this @ 🔗 GTELaunchpadV2Pair.endRewardsAccrual#105:9 | 🎯💥🟢🔴🌀 | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 SafeTransferLib.forceSafeTransferETH#110:13 | | selfbalance()() < amount
this @ 🔗 SafeTransferLib.forceSafeTransferAllETH#127:13 | | ! call(uint256,uint256,uint256,uint256,uint256,uint256,uint256)(gasStipend,to,selfbalance()(),codesize()(),0x00,codesize()(),0x00)
this @ 🔗 SafeTransferLib.forceSafeTransferAllETH#131:17 | | ! create(uint256,uint256,uint256)(selfbalance()(),0x0b,0x16)
this @ 🔗 SafeTransferLib.forceSafeTransferETH#140:13 | 🟢 | selfbalance()() < amount
this @ 🔗 GTELaunchpadV2Pair.mint#185:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.mint#186:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(token1).balanceOf(address(this))
this @ 🔗 SafeTransferLib.forceSafeTransferAllETH#158:13 | 🟢 | ! call(uint256,uint256,uint256,uint256,uint256,uint256,uint256)(GAS_STIPEND_NO_GRIEF,to,selfbalance()(),codesize()(),0x00,codesize()(),0x00)
this @ 🔗 SafeTransferLib.forceSafeTransferAllETH#162:17 | 🟢 | ! create(uint256,uint256,uint256)(selfbalance()(),0x0b,0x16)
this @ 🔗 GTELaunchpadV2Pair.burn#211:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#212:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#213:9 | 🎯💥🟢🔴🌀 ['lock'] | liquidity = balanceOf[address(this)]
this @ 🔗 GTELaunchpadV2Pair.burn#220:9 | 🎯💥🟢🔴🌀 ['lock'] | _burn(address(this),liquidity)
this @ 🔗 GTELaunchpadV2Pair.burn#223:9 | 🎯💥🟢🔴🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.burn#224:9 | 🎯💥🟢🔴🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 Distributor.skimExcessRewards#51:13 | 🎯💥🟢❌ ['onlyOwnerOrRoles(uint256)'] | amount > asset.balanceOf(address(this)) - totalPendingRewards[asset]
this @ 🔗 GTELaunchpadV2Pair.swap#247:13 | 🎯💥🟢🌀 ['lock'] | balance0 = IERC20(_token0).balanceOf(address(this))
this @ 🔗 GTELaunchpadV2Pair.swap#248:13 | 🎯💥🟢🌀 ['lock'] | balance1 = IERC20(_token1).balanceOf(address(this))
this @ 🔗 SafeTransferLib.trySafeTransferAllETH#185:13 | | success = call(uint256,uint256,uint256,uint256,uint256,uint256,uint256)(gasStipend,to,selfbalance()(),codesize()(),0x00,codesize()(),0x00)
this @ 🔗 GTL._convertToAssets#293:9 | 🎯💥🟢🟩 | shares.fullMulDiv(usdc.balanceOf(address(this)) + allocatedAssets + 1,totalSupply() + 1)
this @ 🔗 ERC4626.totalAssets#153:9 | 💥🟩 | assets = SafeTransferLib.balanceOf(asset(),address(this))
this @ 🔗 GTELaunchpadV2Pair.sync#316:9 | 🎯💥🟢🌀 ['lock'] | _update(IERC20(token0).balanceOf(address(this)),IERC20(token1).balanceOf(address(this)),reserve0,reserve1,uint112(0),uint112(0))
this @ 🔗 Launchpad.buy#290:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | address(data.quote).safeTransferFrom(buyData.account,address(this),amountInQuote)
this @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)
this @ 🔗 SafeTransferLib.safeTransferAll#306:13 | | mstore(uint256,uint256)(0x20,address()())
this @ 🔗 Launchpad.sell#359:9 | 🎯💥🟢🌀❌ ['nonReentrant', 'onlyBondingActive(address)', 'onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amountInBase)
this @ 🔗 AccountManager.deposit#186:9 | 🎯💥❌ ['onlySenderOrOperator(address,SpotOperatorRoles)'] | token.safeTransferFrom(account,address(this),amount)
this @ 🔗 Distributor.addRewards#124:13 | 🎯💥 | launchAsset.safeTransferFrom(msg.sender,address(this),uint256(launchAssetAmount))
this @ 🔗 Distributor.addRewards#130:13 | 🎯💥 | quoteAsset.safeTransferFrom(msg.sender,address(this),uint256(quoteAssetAmount))

block.timestamp
block.timestamp @ 🔗 Launchpad._createPairAndSwapRemaining#500:9 | 🎯🟢🌀 | uniV2Router.addLiquidity({tokenA:token,tokenB:address(data.quote),amountADesired:tokensToLock,amountBDesired:quoteToLock,amountAMin:0,amountBMin:0,to:address(launchpadLPVault),deadline:block.timestamp})
block.timestamp @ 🔗 Launchpad._swapRemaining#548:9 | 🎯🟢🌀 | uniV2Router.swapTokensForExactTokens(data.baseAmount,data.quoteAmount,path,data.recipient,block.timestamp + 1)
block.timestamp @ 🔗 GTELaunchpadV2Pair._update#132:9 | 🎯🟢🔴 | blockTimestamp = uint32(block.timestamp % 2 ** 32)
block.timestamp @ 🔗 GTERouter._executeUniV2SwapExactTokensForTokens#332:9 | 🎯🟢🌀 | amounts = uniV2Router.swapExactTokensForTokens(route.prevAmountOut,0,path,address(this),block.timestamp)
block.timestamp @ 🔗 LaunchToken._endRewards#156:9 | 🎯🟢🌀 | FeeShareConcluded(block.timestamp,_incEventNonce())

msg.value
msg.value @ 🔗 GTERouter.wrapSpotDeposit#146:9 | 🎯💥🟢🌀💲 | weth.deposit{value: msg.value}()
msg.value @ 🔗 GTERouter.wrapSpotDeposit#147:9 | 🎯💥🟢🌀💲 | address(weth).safeApprove(address(acctManager),msg.value)
msg.value @ 🔗 GTERouter.wrapSpotDeposit#148:9 | 🎯💥🟢🌀💲 | acctManager.depositFromRouter(msg.sender,address(weth),msg.value)

modifiers_html

functions_html

SignatureCheckerLib,/home/ubuntu/2025-08-gte-perps/lib/solady/src/utils/SignatureCheckerLib.sol#24:1

state_vars_html


Solidity Vars Used

block.timestamp
block.timestamp @ 🔗 AdminPanel._validateSig#708:13 | 🎯🟩 | signData.expiry < block.timestamp

modifiers_html

functions_html